annotate libervia/server/server.py @ 1504:409d10211b20

server, browser: dynamic pages refactoring: dynamic pages has been reworked, to change the initial basic implementation. Pages are now dynamic by default, and a websocket is established by the first connected page of a session. The socket is used to transmit bridge signals, and then the signal is broadcasted to other tabs using broadcast channel. If the connecting tab is closed, an other one is chosen. Some tests are made to retry connecting in case of problem, and sometimes reload the pages (e.g. if profile is connected). Signals (or other data) are cached during reconnection phase, to avoid lost of data. All previous partial rendering mechanism have been removed, chat page is temporarily not working anymore, but will be eventually redone (one of the goal of this work is to have proper chat).
author Goffi <goffi@goffi.org>
date Wed, 01 Mar 2023 18:02:44 +0100
parents 6643855770a5
children a169cbc315f0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1233
5bd801bd36aa server: fixed shebang
Goffi <goffi@goffi.org>
parents: 1228
diff changeset
1 #!/usr/bin/env python3
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
2
1397
ed037818d6de core (constants): renaming following global project renaming
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
3 # Libervia Web
1396
822bd0139769 date update
Goffi <goffi@goffi.org>
parents: 1383
diff changeset
4 # Copyright (C) 2011-2021 Jérôme Poisson <goffi@goffi.org>
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
5
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
6 # This program is free software: you can redistribute it and/or modify
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
9 # (at your option) any later version.
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
10
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
11 # This program is distributed in the hope that it will be useful,
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
14 # GNU Affero General Public License for more details.
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
15
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
18
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
19 import re
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
20 import os.path
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
21 import sys
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
22 import urllib.parse
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
23 import urllib.request, urllib.error
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
24 import time
1203
251eba911d4d server (websockets): fixed websocket handling on HTTPS connections:
Goffi <goffi@goffi.org>
parents: 1202
diff changeset
25 import copy
1459
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
26 from typing import Optional
1242
8f39d98416c5 server: added a child for common cache
Goffi <goffi@goffi.org>
parents: 1240
diff changeset
27 from pathlib import Path
444
b64e528fb524 server side: use of bridge's getReady to be sure that backend is initialised at launch
Goffi <goffi@goffi.org>
parents: 438
diff changeset
28 from twisted.application import service
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
29 from twisted.internet import reactor, defer, inotify
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
30 from twisted.web import server
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
31 from twisted.web import static
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
32 from twisted.web import resource as web_resource
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
33 from twisted.web import util as web_util
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
34 from twisted.web import vhost
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
35 from . import proxy
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
36 from twisted.python.components import registerAdapter
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
37 from twisted.python import failure
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
38 from twisted.python import filepath
750
8ac862f6e5b3 browser and server sides: allow to connect with a JID that is not registered on the local server
souliane <souliane@mailoo.org>
parents: 746
diff changeset
39 from twisted.words.protocols.jabber import jid
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
40
438
582c435dab6b server side: new log system is used
Goffi <goffi@goffi.org>
parents: 435
diff changeset
41 from sat.core.log import getLogger
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
42
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
43 from sat_frontends.bridge.dbus_bridge import (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
44 Bridge,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
45 BridgeExceptionNoService,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
46 const_TIMEOUT as BRIDGE_TIMEOUT,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
47 )
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
48 from sat.core.i18n import _, D_
605
917e271975d9 server + browser side: implementation of new getEntitiesData bridge method + added a security check: only a white list of entities can be gotten
Goffi <goffi@goffi.org>
parents: 589
diff changeset
49 from sat.core import exceptions
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
50 from sat.tools import utils
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
51 from sat.tools import config
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
52 from sat.tools.common import regex
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
53 from sat.tools.common import template
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
54 from sat.tools.common import uri as common_uri
1282
0e4e413eb8db server: user new OrderedSet to handle scripts:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
55 from sat.tools.common.utils import recursive_update, OrderedSet
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
56 from sat.tools.common import data_format
1274
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
57 from sat.tools.common import tls
1362
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
58 from sat_frontends.bridge.bridge_frontend import BridgeException
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
59 import libervia
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
60 from libervia.server import websockets
984
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
61 from libervia.server.pages import LiberviaPage
1063
4b69f69c6ffd server: new ProgressHandler helper class, to handle progressing actions
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
62 from libervia.server.utils import quote, ProgressHandler
1245
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
63 from libervia.server.tasks.manager import TasksManager
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
64 from functools import partial
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
65
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
66 from libervia.server.constants import Const as C
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents: 917
diff changeset
67 from libervia.server import session_iface
1287
1f26d8c2afc1 server: restricted_bridge first draft:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
68 from .restricted_bridge import RestrictedBridge
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
69
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
70 log = getLogger(__name__)
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
71
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
72
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
73 DEFAULT_MASK = (inotify.IN_CREATE | inotify.IN_MODIFY | inotify.IN_MOVE_SELF
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
74 | inotify.IN_MOVED_TO)
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
75
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
76
1361
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
77 class SysExit(Exception):
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
78
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
79 def __init__(self, exit_code, message=""):
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
80 self.exit_code = exit_code
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
81 self.message = message
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
82
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
83 def __str__(self):
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
84 return f"System Exit({self.exit_code}): {self.message}"
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
85
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
86
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
87 class FilesWatcher(object):
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
88 """Class to check files modifications using iNotify"""
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
89 _notifier = None
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
90
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
91 def __init__(self, host):
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
92 self.host = host
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
93
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
94 @property
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
95 def notifier(self):
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
96 if self._notifier == None:
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
97 notifier = self.__class__._notifier = inotify.INotify()
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
98 notifier.startReading()
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
99 return self._notifier
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
100
1251
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
101 def _checkCallback(self, dir_path, callback, recursive):
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
102 # Twisted doesn't add callback if a watcher was already set on a path
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
103 # but in dev mode Libervia watches whole sites + internal path can be watched
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
104 # by tasks, so several callbacks must be called on some paths.
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
105 # This method check that the new callback is indeed present in the desired path
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
106 # and add it otherwise.
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
107 # FIXME: this should probably be fixed upstream
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
108 if recursive:
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
109 for child in dir_path.walk():
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
110 if child.isdir():
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
111 self._checkCallback(child, callback, recursive=False)
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
112 else:
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
113 watch_id = self.notifier._isWatched(dir_path)
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
114 if watch_id is None:
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
115 log.warning(
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
116 f"There is no watch ID for path {dir_path}, this should not happen"
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
117 )
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
118 else:
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
119 watch_point = self.notifier._watchpoints[watch_id]
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
120 if callback not in watch_point.callbacks:
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
121 watch_point.callbacks.append(callback)
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
122
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
123 def watchDir(self, dir_path, callback, mask=DEFAULT_MASK, auto_add=False,
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
124 recursive=False, **kwargs):
1251
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
125 dir_path = str(dir_path)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
126 log.info(_("Watching directory {dir_path}").format(dir_path=dir_path))
1251
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
127 wrapped_callback = lambda __, filepath, mask: callback(
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
128 self.host, filepath, inotify.humanReadableMask(mask), **kwargs)
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
129 callbacks = [wrapped_callback]
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
130 dir_path = filepath.FilePath(dir_path)
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
131 self.notifier.watch(
1251
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
132 dir_path, mask=mask, autoAdd=auto_add, recursive=recursive,
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
133 callbacks=callbacks)
1251
a1606e2a92eb server: fixed watching a directory which is already watched:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
134 self._checkCallback(dir_path, wrapped_callback, recursive)
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
135
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
136
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
137 class LiberviaSession(server.Session):
555
db1b330c1eb1 server_side: set the connection attempt timeout to the bridge timeout (2 minutes)
souliane <souliane@mailoo.org>
parents: 554
diff changeset
138 sessionTimeout = C.SESSION_TIMEOUT
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
139
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
140 def __init__(self, *args, **kwargs):
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
141 self.__lock = False
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
142 server.Session.__init__(self, *args, **kwargs)
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
143
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
144 def lock(self):
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
145 """Prevent session from expiring"""
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
146 self.__lock = True
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
147 self._expireCall.reset(sys.maxsize)
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
148
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
149 def unlock(self):
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
150 """Allow session to expire again, and touch it"""
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
151 self.__lock = False
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
152 self.touch()
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
153
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
154 def touch(self):
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
155 if not self.__lock:
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
156 server.Session.touch(self)
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
157
451
1a0cec9b0f1e better PEP-8 compliance
souliane <souliane@mailoo.org>
parents: 449
diff changeset
158
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
159 class ProtectedFile(static.File):
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
160 """A static.File class which doesn't show directory listing"""
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
161
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
162 def __init__(self, path, *args, **kwargs):
1196
a15ac511390c server: changed defaultType for File resources to "application/octet-stream" instead of "text/html"
Goffi <goffi@goffi.org>
parents: 1191
diff changeset
163 if "defaultType" not in kwargs and len(args) < 2:
a15ac511390c server: changed defaultType for File resources to "application/octet-stream" instead of "text/html"
Goffi <goffi@goffi.org>
parents: 1191
diff changeset
164 # defaultType is second positional argument, and Twisted uses it
a15ac511390c server: changed defaultType for File resources to "application/octet-stream" instead of "text/html"
Goffi <goffi@goffi.org>
parents: 1191
diff changeset
165 # in File.createSimilarFile, so we set kwargs only if it is missing
a15ac511390c server: changed defaultType for File resources to "application/octet-stream" instead of "text/html"
Goffi <goffi@goffi.org>
parents: 1191
diff changeset
166 # in kwargs and it is not in a positional argument
a15ac511390c server: changed defaultType for File resources to "application/octet-stream" instead of "text/html"
Goffi <goffi@goffi.org>
parents: 1191
diff changeset
167 kwargs["defaultType"] = "application/octet-stream"
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
168 super(ProtectedFile, self).__init__(str(path), *args, **kwargs)
1196
a15ac511390c server: changed defaultType for File resources to "application/octet-stream" instead of "text/html"
Goffi <goffi@goffi.org>
parents: 1191
diff changeset
169
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
170 def directoryListing(self):
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
171 return web_resource.NoResource()
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
172
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
173
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
174 def getChild(self, path, request):
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
175 return super().getChild(path, request)
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
176
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
177 def getChildWithDefault(self, path, request):
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
178 return super().getChildWithDefault(path, request)
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
179
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
180 def getChildForRequest(self, request):
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
181 return super().getChildForRequest(request)
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
182
1460
0ea54090e414 server: renamed `sat-app` to `libervia-app` following global renaming
Goffi <goffi@goffi.org>
parents: 1459
diff changeset
183
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
184 class LiberviaRootResource(ProtectedFile):
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
185 """Specialized resource for Libervia root
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
186
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
187 handle redirections declared in sat.conf
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
188 """
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
189
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
190 def __init__(self, host, host_name, site_name, site_path, *args, **kwargs):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
191 ProtectedFile.__init__(self, *args, **kwargs)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
192 self.host = host
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
193 self.host_name = host_name
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
194 self.site_name = site_name
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1251
diff changeset
195 self.site_path = Path(site_path)
1321
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
196 self.default_theme = self.getConfig('theme')
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
197 if self.default_theme is None:
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
198 if not host_name:
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
199 # FIXME: we use bulma theme by default for main site for now
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
200 # as the development is focusing on this one, and default theme may
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
201 # be broken
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
202 self.default_theme = 'bulma'
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
203 else:
eb85ef26cb4a server: use `bulma` theme as default for default site:
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
204 self.default_theme = C.TEMPLATE_THEME_DEFAULT
1258
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
205 self.site_themes = set()
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
206 self.named_pages = {}
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
207 self.browser_modules = {}
1256
08cd652dea14 server, pages, tasks (brython): common_scripts:
Goffi <goffi@goffi.org>
parents: 1253
diff changeset
208 # template dynamic data used in all pages
1282
0e4e413eb8db server: user new OrderedSet to handle scripts:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
209 self.dyn_data_common = {"scripts": OrderedSet()}
1258
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
210 for theme, data in host.renderer.getThemesData(site_name).items():
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
211 # we check themes for browser metadata, and merge them here if found
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
212 self.site_themes.add(theme)
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
213 browser_meta = data.get('browser_meta')
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
214 if browser_meta is not None:
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
215 log.debug(f"merging browser metadata from theme {theme}: {browser_meta}")
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
216 recursive_update(self.browser_modules, browser_meta)
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
217 browser_path = data.get('browser_path')
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
218 if browser_path is not None:
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
219 self.browser_modules.setdefault('themes_browser_paths', set()).add(
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
220 browser_path)
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
221 try:
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
222 next(browser_path.glob("*.py"))
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
223 except StopIteration:
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
224 pass
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
225 else:
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
226 log.debug(f"found brython script(s) for theme {theme}")
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
227 self.browser_modules.setdefault('brython', []).append(
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
228 {
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
229 "path": browser_path,
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
230 "url_hash": None,
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
231 "url_prefix": f"__t_{theme}"
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
232 }
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
233 )
92ff09cdd6dd server: gather themes data:
Goffi <goffi@goffi.org>
parents: 1257
diff changeset
234
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
235 self.uri_callbacks = {}
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
236 self.pages_redirects = {}
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
237 self.cached_urls = {}
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
238 self.main_menu = None
1460
0ea54090e414 server: renamed `sat-app` to `libervia-app` following global renaming
Goffi <goffi@goffi.org>
parents: 1459
diff changeset
239 # map Libervia application names => data
0ea54090e414 server: renamed `sat-app` to `libervia-app` following global renaming
Goffi <goffi@goffi.org>
parents: 1459
diff changeset
240 self.libervia_apps = {}
1257
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
241 self.build_path = host.getBuildPath(site_name)
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
242 self.build_path.mkdir(parents=True, exist_ok=True)
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
243 self.dev_build_path = host.getBuildPath(site_name, dev=True)
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
244 self.dev_build_path.mkdir(parents=True, exist_ok=True)
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
245 self.putChild(
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
246 C.BUILD_DIR.encode(),
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
247 ProtectedFile(
1257
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
248 self.build_path,
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
249 defaultType="application/octet-stream"),
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
250 )
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
251
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
252 def __str__(self):
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
253 return (
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
254 f"Root resource for {self.host_name or 'default host'} using "
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
255 f"{self.site_name or 'default site'} at {self.site_path} and deserving "
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
256 f"files at {self.path}"
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
257 )
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
258
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
259 def getConfig(self, key, default=None, value_type=None):
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
260 """Retrieve configuration for this site
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
261
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
262 params are the same as for [Libervia.getConfig]
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
263 """
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
264 return self.host.getConfig(self, key, default, value_type)
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
265
1293
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1292
diff changeset
266 def getFrontURL(self, theme):
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1292
diff changeset
267 return Path(
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1292
diff changeset
268 '/',
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1292
diff changeset
269 C.TPL_RESOURCE,
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1292
diff changeset
270 self.site_name or C.SITE_NAME_DEFAULT,
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1292
diff changeset
271 C.TEMPLATE_TPL_DIR,
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1292
diff changeset
272 theme)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
273
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
274 def addResourceToPath(self, path: str, resource: web_resource.Resource) -> None:
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
275 """Add a resource to the given path
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
276
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
277 A "NoResource" will be used for all intermediate segments
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
278 """
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
279 segments, __, last_segment = path.rpartition("/")
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
280 url_segments = segments.split("/") if segments else []
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
281 current = self
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
282 for segment in url_segments:
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
283 resource = web_resource.NoResource()
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
284 current.putChild(segment, resource)
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
285 current = resource
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
286
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
287 current.putChild(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
288 last_segment.encode('utf-8'),
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
289 resource
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
290 )
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
291
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
292 async def _startApp(self, app_name, extra=None):
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
293 if extra is None:
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
294 extra = {}
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
295 log.info(_(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
296 "starting application {app_name}").format(app_name=app_name))
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
297 await self.host.bridgeCall(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
298 "applicationStart", app_name, data_format.serialise(extra)
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
299 )
1460
0ea54090e414 server: renamed `sat-app` to `libervia-app` following global renaming
Goffi <goffi@goffi.org>
parents: 1459
diff changeset
300 app_data = self.libervia_apps[app_name] = data_format.deserialise(
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
301 await self.host.bridgeCall(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
302 "applicationExposedGet", app_name, "", ""))
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
303
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
304 try:
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
305 web_port = int(app_data['ports']['web'].split(':')[1])
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
306 except (KeyError, ValueError):
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
307 log.warning(_(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
308 "no web port found for application {app_name!r}, can't use it "
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
309 ).format(app_name=app_name))
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
310 raise exceptions.DataError("no web port found")
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
311
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
312 try:
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
313 url_prefix = app_data['url_prefix'].strip().rstrip('/')
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
314 except (KeyError, AttributeError) as e:
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
315 log.warning(_(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
316 "no URL prefix specified for this application, we can't embed it: {msg}")
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
317 .format(msg=e))
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
318 raise exceptions.DataError("no URL prefix")
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
319
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
320 if not url_prefix.startswith('/'):
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
321 raise exceptions.DataError(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
322 f"invalid URL prefix, it must start with '/': {url_prefix!r}")
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
323
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
324 res = proxy.SatReverseProxyResource(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
325 "localhost",
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
326 web_port,
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
327 url_prefix.encode()
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
328 )
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
329 self.addResourceToPath(url_prefix, res)
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
330
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
331 return app_data
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
332
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
333 async def _initRedirections(self, options):
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
334 url_redirections = options["url_redirections_dict"]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
335
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
336 url_redirections = url_redirections.get(self.site_name, {})
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
337
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
338 ## redirections
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
339 self.redirections = {}
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
340 self.inv_redirections = {} # new URL to old URL map
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
341
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
342 for old, new_data_list in url_redirections.items():
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
343 # several redirections can be used for one path by using a list.
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
344 # The redirection will be done using first item of the list, and all items
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
345 # will be used for inverse redirection.
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
346 # e.g. if a => [b, c], a will redirect to c, and b and c will both be
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
347 # equivalent to a
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
348 if not isinstance(new_data_list, list):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
349 new_data_list = [new_data_list]
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
350 for new_data in new_data_list:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
351 # new_data can be a dictionary or a unicode url
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
352 if isinstance(new_data, dict):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
353 # new_data dict must contain either "url", "page" or "path" key
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
354 # (exclusive)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
355 # if "path" is used, a file url is constructed with it
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
356 if ((
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
357 len(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
358 {"path", "url", "page"}.intersection(list(new_data.keys()))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
359 ) != 1
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
360 )):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
361 raise ValueError(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
362 'You must have one and only one of "url", "page" or "path" '
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
363 'key in your url_redirections_dict data'
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
364 )
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
365 if "url" in new_data:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
366 new = new_data["url"]
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
367 elif "page" in new_data:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
368 new = new_data
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
369 new["type"] = "page"
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
370 new.setdefault("path_args", [])
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
371 if not isinstance(new["path_args"], list):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
372 log.error(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
373 _('"path_args" in redirection of {old} must be a list. '
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
374 'Ignoring the redirection'.format(old=old)))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
375 continue
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
376 new.setdefault("query_args", {})
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
377 if not isinstance(new["query_args"], dict):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
378 log.error(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
379 _(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
380 '"query_args" in redirection of {old} must be a '
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
381 'dictionary. Ignoring the redirection'
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
382 ).format(old=old)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
383 )
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
384 continue
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
385 new["path_args"] = [quote(a) for a in new["path_args"]]
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
386 # we keep an inversed dict of page redirection
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
387 # (page/path_args => redirecting URL)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
388 # so getURL can return the redirecting URL if the same arguments
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
389 # are used # making the URL consistent
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
390 args_hash = tuple(new["path_args"])
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
391 self.pages_redirects.setdefault(new_data["page"], {}).setdefault(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
392 args_hash,
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
393 old
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
394 )
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
395
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
396 # we need lists in query_args because it will be used
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
397 # as it in request.path_args
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
398 for k, v in new["query_args"].items():
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
399 if isinstance(v, str):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
400 new["query_args"][k] = [v]
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
401 elif "path" in new_data:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
402 new = "file:{}".format(urllib.parse.quote(new_data["path"]))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
403 elif isinstance(new_data, str):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
404 new = new_data
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
405 new_data = {}
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
406 else:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
407 log.error(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
408 _("ignoring invalid redirection value: {new_data}").format(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
409 new_data=new_data
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
410 )
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
411 )
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
412 continue
875
d9b98b8a1847 server: handling of dict and "file:" urls in url_redirections_dict:
Goffi <goffi@goffi.org>
parents: 873
diff changeset
413
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
414 # some normalization
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
415 if not old.strip():
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
416 # root URL special case
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
417 old = ""
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
418 elif not old.startswith("/"):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
419 log.error(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
420 _("redirected url must start with '/', got {value}. Ignoring")
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
421 .format(value=old)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
422 )
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
423 continue
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
424 else:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
425 old = self._normalizeURL(old)
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
426
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
427 if isinstance(new, dict):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
428 # dict are handled differently, they contain data
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
429 # which ared use dynamically when the request is done
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
430 self.redirections.setdefault(old, new)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
431 if not old:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
432 if new["type"] == "page":
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
433 log.info(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
434 _("Root URL redirected to page {name}").format(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
435 name=new["page"]
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
436 )
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
437 )
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
438 else:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
439 if new["type"] == "page":
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
440 page = self.getPageByName(new["page"])
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
441 url = page.getURL(*new.get("path_args", []))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
442 self.inv_redirections[url] = old
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
443 continue
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
444
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
445 # at this point we have a redirection URL in new, we can parse it
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
446 new_url = urllib.parse.urlsplit(new)
875
d9b98b8a1847 server: handling of dict and "file:" urls in url_redirections_dict:
Goffi <goffi@goffi.org>
parents: 873
diff changeset
447
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
448 # we handle the known URL schemes
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
449 if new_url.scheme == "xmpp":
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
450 location = self.getPagePathFromURI(new)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
451 if location is None:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
452 log.warning(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
453 _("ignoring redirection, no page found to handle this URI: "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
454 "{uri}").format(uri=new))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
455 continue
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
456 request_data = self._getRequestData(location)
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
457 self.inv_redirections[location] = old
875
d9b98b8a1847 server: handling of dict and "file:" urls in url_redirections_dict:
Goffi <goffi@goffi.org>
parents: 873
diff changeset
458
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
459 elif new_url.scheme in ("", "http", "https"):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
460 # direct redirection
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
461 if new_url.netloc:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
462 raise NotImplementedError(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
463 "netloc ({netloc}) is not implemented yet for "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
464 "url_redirections_dict, it is not possible to redirect to an "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
465 "external website".format(netloc=new_url.netloc))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
466 location = urllib.parse.urlunsplit(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
467 ("", "", new_url.path, new_url.query, new_url.fragment)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
468 )
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
469 request_data = self._getRequestData(location)
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
470 self.inv_redirections[location] = old
875
d9b98b8a1847 server: handling of dict and "file:" urls in url_redirections_dict:
Goffi <goffi@goffi.org>
parents: 873
diff changeset
471
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
472 elif new_url.scheme == "file":
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
473 # file or directory
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
474 if new_url.netloc:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
475 raise NotImplementedError(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
476 "netloc ({netloc}) is not implemented for url redirection to "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
477 "file system, it is not possible to redirect to an external "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
478 "host".format(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
479 netloc=new_url.netloc))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
480 path = urllib.parse.unquote(new_url.path)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
481 if not os.path.isabs(path):
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
482 raise ValueError(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
483 "file redirection must have an absolute path: e.g. "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
484 "file:/path/to/my/file")
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
485 # for file redirection, we directly put child here
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
486 resource_class = (
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
487 ProtectedFile if new_data.get("protected", True) else static.File
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
488 )
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
489 res = resource_class(path, defaultType="application/octet-stream")
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
490 self.addResourceToPath(old, res)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
491 log.info("[{host_name}] Added redirection from /{old} to file system "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
492 "path {path}".format(host_name=self.host_name,
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
493 old=old,
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
494 path=path))
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
495
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
496 # we don't want to use redirection system, so we continue here
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
497 continue
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
498
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
499 elif new_url.scheme == "libervia-app":
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
500 # a Libervia application
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
501
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
502 app_name = urllib.parse.unquote(new_url.path).lower().strip()
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
503 extra = {"url_prefix": f"/{old}"}
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
504 try:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
505 await self._startApp(app_name, extra)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
506 except Exception as e:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
507 log.warning(_(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
508 "Can't launch {app_name!r} for path /{old}: {e}").format(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
509 app_name=app_name, old=old, e=e))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
510 continue
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
511
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
512 log.info("[{host_name}] Added redirection from /{old} to application "
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
513 "{app_name}".format(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
514 host_name=self.host_name,
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
515 old=old,
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
516 app_name=app_name))
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
517
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
518 # normal redirection system is not used here
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
519 continue
1484
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
520 elif new_url.scheme == "proxy":
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
521 # a reverse proxy
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
522 host, port = new_url.hostname, new_url.port
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
523 if host is None or port is None:
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
524 raise ValueError(
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
525 "invalid host or port in proxy redirection, please check your "
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
526 "configuration: {new_url.geturl()}"
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
527 )
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
528 url_prefix = (new_url.path or old).rstrip('/')
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
529 res = proxy.SatReverseProxyResource(
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
530 host,
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
531 port,
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
532 url_prefix.encode(),
1454
fc91b78b71db server: handle "proxy" scheme in configuration
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
533 )
1484
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
534 self.addResourceToPath(old, res)
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
535 log.info(
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
536 f"[{self.host_name}] Added redirection from /{old} to reverse proxy "
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
537 f"{new_url.netloc} with URL prefix {url_prefix}/"
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
538 )
1454
fc91b78b71db server: handle "proxy" scheme in configuration
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
539
1484
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
540 # normal redirection system is not used here
6643855770a5 server: fix indentation following merge
Goffi <goffi@goffi.org>
parents: 1483
diff changeset
541 continue
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
542 else:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
543 raise NotImplementedError(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
544 "{scheme}: scheme is not managed for url_redirections_dict".format(
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
545 scheme=new_url.scheme
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
546 )
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
547 )
875
d9b98b8a1847 server: handling of dict and "file:" urls in url_redirections_dict:
Goffi <goffi@goffi.org>
parents: 873
diff changeset
548
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
549 self.redirections.setdefault(old, request_data)
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
550 if not old:
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
551 log.info(_("[{host_name}] Root URL redirected to {uri}")
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
552 .format(host_name=self.host_name,
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
553 uri=request_data[1]))
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
554
875
d9b98b8a1847 server: handling of dict and "file:" urls in url_redirections_dict:
Goffi <goffi@goffi.org>
parents: 873
diff changeset
555 # the default root URL, if not redirected
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
556 if not "" in self.redirections:
1202
3f791fbc1643 server: if "redirections" is not set, use "/login" page as default
Goffi <goffi@goffi.org>
parents: 1199
diff changeset
557 self.redirections[""] = self._getRequestData(C.LIBERVIA_PAGE_START)
862
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
558
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
559 async def _setMenu(self, menus):
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
560 menus = menus.get(self.site_name, [])
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
561 main_menu = []
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
562 for menu in menus:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
563 if not menu:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
564 msg = _("menu item can't be empty")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
565 log.error(msg)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
566 raise ValueError(msg)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
567 elif isinstance(menu, list):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
568 if len(menu) != 2:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
569 msg = _(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
570 "menu item as list must be in the form [page_name, absolue URL]"
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
571 )
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
572 log.error(msg)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
573 raise ValueError(msg)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
574 page_name, url = menu
1460
0ea54090e414 server: renamed `sat-app` to `libervia-app` following global renaming
Goffi <goffi@goffi.org>
parents: 1459
diff changeset
575 elif menu.startswith("libervia-app:"):
1462
87e48b6a1bbd server: fix `libervia-app` name parsing following prefix change
Goffi <goffi@goffi.org>
parents: 1460
diff changeset
576 app_name = menu[13:].strip().lower()
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
577 app_data = await self._startApp(app_name)
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
578 front_url = app_data['front_url']
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
579 options = self.host.options
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
580 url_redirections = options["url_redirections_dict"].setdefault(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
581 self.site_name, {})
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
582 if front_url in url_redirections:
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
583 raise exceptions.ConflictError(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
584 f"There is already a redirection from {front_url!r}, can't add "
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
585 f"{app_name!r}")
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
586
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
587 url_redirections[front_url] = {
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
588 "page": 'embed_app',
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
589 "path_args": [app_name]
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
590 }
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
591
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
592 page_name = app_data.get('web_label', app_name).title()
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
593 url = front_url
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
594
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
595 log.debug(
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
596 f"Application {app_name} added to menu of {self.site_name}"
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
597 )
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
598 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
599 page_name = menu
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
600 try:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
601 url = self.getPageByName(page_name).url
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
602 except KeyError as e:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
603 log_msg = _("Can'find a named page ({msg}), please check "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
604 "menu_json in configuration.").format(msg=e.args[0])
1131
9cf592d1e6aa server: better error handling when a named page mentioned in menu_json is missing
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
605 log.error(log_msg)
9cf592d1e6aa server: better error handling when a named page mentioned in menu_json is missing
Goffi <goffi@goffi.org>
parents: 1130
diff changeset
606 raise exceptions.ConfigError(log_msg)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
607 main_menu.append((page_name, url))
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
608 self.main_menu = main_menu
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
609
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
610 def _normalizeURL(self, url, lower=True):
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
611 """Return URL normalized for self.redirections dict
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
612
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
613 @param url(unicode): URL to normalize
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
614 @param lower(bool): lower case of url if True
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
615 @return (str): normalized URL
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
616 """
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
617 if lower:
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
618 url = url.lower()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
619 return "/".join((p for p in url.split("/") if p))
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
620
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
621 def _getRequestData(self, uri):
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
622 """Return data needed to redirect request
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
623
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
624 @param url(unicode): destination url
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
625 @return (tuple(list[str], str, str, dict): tuple with
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
626 splitted path as in Request.postpath
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
627 uri as in Request.uri
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
628 path as in Request.path
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
629 args as in Request.args
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
630 """
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
631 uri = uri
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
632 # XXX: we reuse code from twisted.web.http.py here
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
633 # as we need to have the same behaviour
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
634 x = uri.split("?", 1)
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
635
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
636 if len(x) == 1:
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
637 path = uri
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
638 args = {}
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
639 else:
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
640 path, argstring = x
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
641 args = urllib.parse.parse_qs(argstring, True)
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
642
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
643 # XXX: splitted path case must not be changed, as it may be significant
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
644 # (e.g. for blog items)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
645 return (
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
646 self._normalizeURL(path, lower=False).split("/"),
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
647 uri,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
648 path,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
649 args,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
650 )
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
651
862
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
652 def _redirect(self, request, request_data):
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
653 """Redirect an URL by rewritting request
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
654
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
655 this is *NOT* a HTTP redirection, but equivalent to URL rewritting
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
656 @param request(web.http.request): original request
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
657 @param request_data(tuple): data returned by self._getRequestData
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
658 @return (web_resource.Resource): resource to use
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
659 """
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
660 # recursion check
862
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
661 try:
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
662 request._redirected
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
663 except AttributeError:
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
664 pass
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
665 else:
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
666 try:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
667 __, uri, __, __ = request_data
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
668 except ValueError:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
669 uri = ""
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
670 log.error(D_( "recursive redirection, please fix this URL:\n"
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
671 "{old} ==> {new}").format(
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
672 old=request.uri.decode("utf-8"), new=uri))
862
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
673 return web_resource.NoResource()
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
674
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
675 request._redirected = True # here to avoid recursive redirections
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
676
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
677 if isinstance(request_data, dict):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
678 if request_data["type"] == "page":
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
679 try:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
680 page = self.getPageByName(request_data["page"])
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
681 except KeyError:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
682 log.error(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
683 _(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
684 'Can\'t find page named "{name}" requested in redirection'
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
685 ).format(name=request_data["page"])
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
686 )
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
687 return web_resource.NoResource()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
688 path_args = [pa.encode('utf-8') for pa in request_data["path_args"]]
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
689 request.postpath = path_args + request.postpath
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
690
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
691 try:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
692 request.args.update(request_data["query_args"])
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
693 except (TypeError, ValueError):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
694 log.error(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
695 _("Invalid args in redirection: {query_args}").format(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
696 query_args=request_data["query_args"]
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
697 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
698 )
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
699 return web_resource.NoResource()
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
700 return page
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
701 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
702 raise exceptions.InternalError("unknown request_data type")
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
703 else:
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
704 path_list, uri, path, args = request_data
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
705 path_list = [p.encode('utf-8') for p in path_list]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
706 log.debug(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
707 "Redirecting URL {old} to {new}".format(
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
708 old=request.uri.decode('utf-8'), new=uri
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
709 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
710 )
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
711 # we change the request to reflect the new url
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
712 request.postpath = path_list[1:] + request.postpath
1158
fb4b4da61132 backend: fixed args transmission on page redirection.
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
713 request.args.update(args)
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
714
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
715 # we start again to look for a child with the new url
862
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
716 return self.getChildWithDefault(path_list[0], request)
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
717
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
718 def getPageByName(self, name):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
719 """Retrieve page instance from its name
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
720
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
721 @param name(unicode): name of the page
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
722 @return (LiberviaPage): page instance
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
723 @raise KeyError: the page doesn't exist
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
724 """
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
725 return self.named_pages[name]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
726
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
727 def getPagePathFromURI(self, uri):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
728 """Retrieve page URL from xmpp: URI
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
729
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
730 @param uri(unicode): URI with a xmpp: scheme
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
731 @return (unicode,None): absolute path (starting from root "/") to page handling
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
732 the URI.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
733 None is returned if no page has been registered for this URI
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
734 """
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
735 uri_data = common_uri.parseXMPPUri(uri)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
736 try:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
737 page, cb = self.uri_callbacks[uri_data["type"], uri_data["sub_type"]]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
738 except KeyError:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
739 url = None
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
740 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
741 url = cb(page, uri_data)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
742 if url is None:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
743 # no handler found
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
744 # we try to find a more generic one
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
745 try:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
746 page, cb = self.uri_callbacks[uri_data["type"], None]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
747 except KeyError:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
748 pass
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
749 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
750 url = cb(page, uri_data)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
751 return url
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
752
862
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
753 def getChildWithDefault(self, name, request):
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
754 # XXX: this method is overriden only for root url
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
755 # which is the only ones who need to be handled before other children
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
756 if name == b"" and not request.postpath:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
757 return self._redirect(request, self.redirections[""])
862
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
758 return super(LiberviaRootResource, self).getChildWithDefault(name, request)
e3e2effc9a4c server: LiberviaRootResource now manages root url redirection, and former redirection has been replaced by it:
Goffi <goffi@goffi.org>
parents: 859
diff changeset
759
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
760 def getChild(self, name, request):
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
761 resource = super(LiberviaRootResource, self).getChild(name, request)
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
762
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
763 if isinstance(resource, web_resource.NoResource):
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
764 # if nothing was found, we try our luck with redirections
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
765 # XXX: we want redirections to happen only if everything else failed
1047
3f6f4d907c30 server: better redirection (fixed issue in remaining path arguments)
Goffi <goffi@goffi.org>
parents: 1046
diff changeset
766 path_elt = request.prepath + request.postpath
1457
792a2e902ee9 server: fix inverse URL redirection for root path + allow multiple inverse redirections:
Goffi <goffi@goffi.org>
parents: 1435
diff changeset
767 for idx in range(len(path_elt), -1, -1):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
768 test_url = b"/".join(path_elt[:idx]).decode('utf-8').lower()
1047
3f6f4d907c30 server: better redirection (fixed issue in remaining path arguments)
Goffi <goffi@goffi.org>
parents: 1046
diff changeset
769 if test_url in self.redirections:
3f6f4d907c30 server: better redirection (fixed issue in remaining path arguments)
Goffi <goffi@goffi.org>
parents: 1046
diff changeset
770 request_data = self.redirections[test_url]
3f6f4d907c30 server: better redirection (fixed issue in remaining path arguments)
Goffi <goffi@goffi.org>
parents: 1046
diff changeset
771 request.postpath = path_elt[idx:]
979
1d558dfb32ca server: pages redirection:
Goffi <goffi@goffi.org>
parents: 978
diff changeset
772 return self._redirect(request, request_data)
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
773
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
774 return resource
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
775
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
776 def putChild(self, path, resource):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
777 """Add a child to the root resource"""
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
778 if not isinstance(path, bytes):
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
779 raise ValueError("path must be specified in bytes")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
780 if not isinstance(resource, web_resource.EncodingResourceWrapper):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
781 # FIXME: check that no information is leaked (c.f. https://twistedmatrix.com/documents/current/web/howto/using-twistedweb.html#request-encoders)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
782 resource = web_resource.EncodingResourceWrapper(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
783 resource, [server.GzipEncoderFactory()])
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
784
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
785 super(LiberviaRootResource, self).putChild(path, resource)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
786
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
787 def createSimilarFile(self, path):
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
788 # XXX: this method need to be overriden to avoid recreating a LiberviaRootResource
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
789
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
790 f = LiberviaRootResource.__base__(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
791 path, self.defaultType, self.ignoredExts, self.registry
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
792 )
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
793 # refactoring by steps, here - constructor should almost certainly take these
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
794 f.processors = self.processors
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
795 f.indexNames = self.indexNames[:]
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
796 f.childNotFound = self.childNotFound
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
797 return f
451
1a0cec9b0f1e better PEP-8 compliance
souliane <souliane@mailoo.org>
parents: 449
diff changeset
798
1a0cec9b0f1e better PEP-8 compliance
souliane <souliane@mailoo.org>
parents: 449
diff changeset
799
554
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
800 class WaitingRequests(dict):
796
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
801 def setRequest(self, request, profile, register_with_ext_jid=False):
554
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
802 """Add the given profile to the waiting list.
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
803
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
804 @param request (server.Request): the connection request
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
805 @param profile (str): %(doc_profile)s
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
806 @param register_with_ext_jid (bool): True if we will try to register the
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
807 profile with an external XMPP account credentials
554
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
808 """
555
db1b330c1eb1 server_side: set the connection attempt timeout to the bridge timeout (2 minutes)
souliane <souliane@mailoo.org>
parents: 554
diff changeset
809 dc = reactor.callLater(BRIDGE_TIMEOUT, self.purgeRequest, profile)
796
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
810 self[profile] = (request, dc, register_with_ext_jid)
554
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
811
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
812 def purgeRequest(self, profile):
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
813 """Remove the given profile from the waiting list.
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
814
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
815 @param profile (str): %(doc_profile)s
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
816 """
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
817 try:
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
818 dc = self[profile][1]
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
819 except KeyError:
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
820 return
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
821 if dc.active():
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
822 dc.cancel()
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
823 del self[profile]
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
824
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
825 def getRequest(self, profile):
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
826 """Get the waiting request for the given profile.
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
827
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
828 @param profile (str): %(doc_profile)s
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
829 @return: the waiting request or None
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
830 """
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
831 return self[profile][0] if profile in self else None
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
832
796
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
833 def getRegisterWithExtJid(self, profile):
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
834 """Get the value of the register_with_ext_jid parameter.
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
835
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
836 @param profile (str): %(doc_profile)s
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
837 @return: bool or None
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
838 """
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
839 return self[profile][2] if profile in self else None
fad9c9f82ae3 browser and server sides: alert the user after he created a new profile using his XMPP account credentials
souliane <souliane@mailoo.org>
parents: 794
diff changeset
840
554
471b6babe960 server_side: set a timeout to reset the waiting connection requests after 5 minutes
souliane <souliane@mailoo.org>
parents: 553
diff changeset
841
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
842 class Libervia(service.Service):
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
843 debug = defer.Deferred.debug # True if twistd/Libervia is launched in debug mode
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
844
810
3905bc24eb17 server: proper options handling
Goffi <goffi@goffi.org>
parents: 801
diff changeset
845 def __init__(self, options):
3905bc24eb17 server: proper options handling
Goffi <goffi@goffi.org>
parents: 801
diff changeset
846 self.options = options
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
847 websockets.host = self
1236
352e189ab7f8 server: avoid double init
Goffi <goffi@goffi.org>
parents: 1235
diff changeset
848
352e189ab7f8 server: avoid double init
Goffi <goffi@goffi.org>
parents: 1235
diff changeset
849 def _init(self):
352e189ab7f8 server: avoid double init
Goffi <goffi@goffi.org>
parents: 1235
diff changeset
850 # we do init here and not in __init__ to avoid doule initialisation with twistd
352e189ab7f8 server: avoid double init
Goffi <goffi@goffi.org>
parents: 1235
diff changeset
851 # this _init is called in startService
444
b64e528fb524 server side: use of bridge's getReady to be sure that backend is initialised at launch
Goffi <goffi@goffi.org>
parents: 438
diff changeset
852 self.initialised = defer.Deferred()
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
853 self.waiting_profiles = WaitingRequests() # FIXME: should be removed
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
854 self._main_conf = None
1152
1c23252958ed server: iNotify support:
Goffi <goffi@goffi.org>
parents: 1151
diff changeset
855 self.files_watcher = FilesWatcher(self)
470
34ce41e014c4 server side: options managing improvments:
Goffi <goffi@goffi.org>
parents: 465
diff changeset
856
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
857 if self.options["base_url_ext"]:
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
858 self.base_url_ext = self.options.pop("base_url_ext")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
859 if self.base_url_ext[-1] != "/":
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
860 self.base_url_ext += "/"
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
861 self.base_url_ext_data = urllib.parse.urlsplit(self.base_url_ext)
881
6bdee34fa2f4 server: added base_url_ext option to handle different external URLs (e.g.: if there is a proxy)
Goffi <goffi@goffi.org>
parents: 875
diff changeset
862 else:
6bdee34fa2f4 server: added base_url_ext option to handle different external URLs (e.g.: if there is a proxy)
Goffi <goffi@goffi.org>
parents: 875
diff changeset
863 self.base_url_ext = None
884
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 881
diff changeset
864 # we split empty string anyway so we can do things like
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 881
diff changeset
865 # scheme = self.base_url_ext_data.scheme or 'https'
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
866 self.base_url_ext_data = urllib.parse.urlsplit("")
884
763da94ba28b blog (atom): base_url_ext can now only specify scheme, or netloc, or path, it will be used to complete data coming from request's path
Goffi <goffi@goffi.org>
parents: 881
diff changeset
867
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
868 if not self.options["port_https_ext"]:
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
869 self.options["port_https_ext"] = self.options["port_https"]
470
34ce41e014c4 server side: options managing improvments:
Goffi <goffi@goffi.org>
parents: 465
diff changeset
870
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
871 self._cleanup = []
470
34ce41e014c4 server side: options managing improvments:
Goffi <goffi@goffi.org>
parents: 465
diff changeset
872
451
1a0cec9b0f1e better PEP-8 compliance
souliane <souliane@mailoo.org>
parents: 449
diff changeset
873 self.sessions = {} # key = session value = user
1a0cec9b0f1e better PEP-8 compliance
souliane <souliane@mailoo.org>
parents: 449
diff changeset
874 self.prof_connected = set() # Profiles connected
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
875 self.ns_map = {} # map of short name to namespaces
470
34ce41e014c4 server side: options managing improvments:
Goffi <goffi@goffi.org>
parents: 465
diff changeset
876
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
877 ## bridge ##
1367
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
878 self._bridge_retry = self.options['bridge-retries']
1126
7cd89277a129 server: fixed missing backend detection
Goffi <goffi@goffi.org>
parents: 1124
diff changeset
879 self.bridge = Bridge()
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
880 self.bridge.bridgeConnect(callback=self._bridgeCb, errback=self._bridgeEb)
553
8492c2bb463b server_side: enable HTTP gzip compression
souliane <souliane@mailoo.org>
parents: 522
diff changeset
881
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
882 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
883 def roots(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
884 """Return available virtual host roots
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
885
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
886 Root resources are only returned once, even if they are present for multiple
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
887 named vhosts. Order is not relevant, except for default vhost which is always
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
888 returned first.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
889 @return (list[web_resource.Resource]): all vhost root resources
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
890 """
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
891 roots = list(set(self.vhost_root.hosts.values()))
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
892 default = self.vhost_root.default
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
893 if default is not None and default not in roots:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
894 roots.insert(0, default)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
895 return roots
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
896
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
897 @property
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
898 def main_conf(self):
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
899 """SafeConfigParser instance opened on configuration file (sat.conf)"""
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
900 if self._main_conf is None:
1240
14c0f666a93d server: log config files names
Goffi <goffi@goffi.org>
parents: 1237
diff changeset
901 self._main_conf = config.parseMainConf(log_filenames=True)
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
902 return self._main_conf
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
903
1147
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
904 def getConfig(self, site_root_res, key, default=None, value_type=None):
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
905 """Retrieve configuration associated to a site
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
906
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
907 Section is automatically set to site name
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
908 @param site_root_res(LiberviaRootResource): resource of the site in use
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
909 @param key(unicode): key to use
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
910 @param default: value to use if not found (see [config.getConfig])
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
911 @param value_type(unicode, None): filter to use on value
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
912 Note that filters are already automatically used when the key finish
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
913 by a well known suffix ("_path", "_list", "_dict", or "_json")
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
914 None to use no filter, else can be:
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
915 - "path": a path is expected, will be normalized and expanded
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
916
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
917 """
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1274
diff changeset
918 section = site_root_res.site_name.lower().strip() or C.CONFIG_SECTION
1147
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
919 value = config.getConfig(self.main_conf, section, key, default=default)
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
920 if value_type is not None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
921 if value_type == 'path':
1147
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
922 v_filter = lambda v: os.path.abspath(os.path.expanduser(v))
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
923 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
924 raise ValueError("unknown value type {value_type}".format(
1147
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
925 value_type = value_type))
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
926 if isinstance(value, list):
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
927 value = [v_filter(v) for v in value]
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
928 elif isinstance(value, dict):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
929 value = {k:v_filter(v) for k,v in list(value.items())}
1147
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
930 elif value is not None:
1217
fe9782391f63 server: fixed value filtering in getConfig
Goffi <goffi@goffi.org>
parents: 1216
diff changeset
931 value = v_filter(value)
1147
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
932 return value
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
933
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
934 def _namespacesGetCb(self, ns_map):
1383
81b472bcf0a1 server: be sure to have strings for ns_map
Goffi <goffi@goffi.org>
parents: 1370
diff changeset
935 self.ns_map = {str(k): str(v) for k,v in ns_map.items()}
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
936
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
937 def _namespacesGetEb(self, failure_):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
938 log.error(_("Can't get namespaces map: {msg}").format(msg=failure_))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
939
1130
8a7d75c18d40 server: fixed front_url_filter in templates renderer
Goffi <goffi@goffi.org>
parents: 1129
diff changeset
940 @template.contextfilter
1127
9234f29053b0 server, pages: update to handle multi sites themes, first draft:
Goffi <goffi@goffi.org>
parents: 1126
diff changeset
941 def _front_url_filter(self, ctx, relative_url):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
942 template_data = ctx['template_data']
1292
e30e96958fb7 server: use C.SITE_NAME_DEFAULT instead of "sat" when suitable
Goffi <goffi@goffi.org>
parents: 1287
diff changeset
943 return os.path.join(
e30e96958fb7 server: use C.SITE_NAME_DEFAULT instead of "sat" when suitable
Goffi <goffi@goffi.org>
parents: 1287
diff changeset
944 '/', C.TPL_RESOURCE, template_data.site or C.SITE_NAME_DEFAULT,
1127
9234f29053b0 server, pages: update to handle multi sites themes, first draft:
Goffi <goffi@goffi.org>
parents: 1126
diff changeset
945 C.TEMPLATE_TPL_DIR, template_data.theme, relative_url)
9234f29053b0 server, pages: update to handle multi sites themes, first draft:
Goffi <goffi@goffi.org>
parents: 1126
diff changeset
946
1132
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
947 def _moveFirstLevelToDict(self, options, key, keys_to_keep):
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
948 """Read a config option and put value at first level into u'' dict
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
949
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
950 This is useful to put values for Libervia official site directly in dictionary,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
951 and to use site_name as keys when external sites are used.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
952 options will be modified in place
1132
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
953 @param options(dict): options to modify
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
954 @param key(unicode): setting key to modify
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
955 @param keys_to_keep(list(unicode)): keys allowed in first level
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
956 """
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
957 try:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
958 conf = options[key]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
959 except KeyError:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
960 return
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
961 if not isinstance(conf, dict):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
962 options[key] = {'': conf}
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
963 return
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
964 default_dict = conf.get('', {})
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
965 to_delete = []
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
966 for key, value in conf.items():
1132
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
967 if key not in keys_to_keep:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
968 default_dict[key] = value
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
969 to_delete.append(key)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
970 for key in to_delete:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
971 del conf[key]
1132
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
972 if default_dict:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
973 conf[''] = default_dict
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
974
1362
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
975 async def checkAndConnectServiceProfile(self):
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
976 passphrase = self.options["passphrase"]
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
977 if not passphrase:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
978 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
979 C.EXIT_BAD_ARG,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
980 _("No passphrase set for service profile, please check installation "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
981 "documentation.")
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
982 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
983 try:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
984 s_prof_connected = await self.bridgeCall("isConnected", C.SERVICE_PROFILE)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
985 except BridgeException as e:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
986 if e.classname == "ProfileUnknownError":
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
987 log.info("Service profile doesn't exist, creating it.")
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
988 try:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
989 xmpp_domain = await self.bridgeCall("getConfig", "", "xmpp_domain")
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
990 xmpp_domain = xmpp_domain.strip()
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
991 if not xmpp_domain:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
992 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
993 C.EXIT_BAD_ARG,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
994 _('"xmpp_domain" must be set to create new accounts, please '
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
995 'check documentation')
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
996 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
997 service_profile_jid_s = f"{C.SERVICE_PROFILE}@{xmpp_domain}"
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
998 await self.bridgeCall(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
999 "inBandAccountNew",
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1000 service_profile_jid_s,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1001 passphrase,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1002 "",
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1003 xmpp_domain,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1004 0,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1005 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1006 except BridgeException as e:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1007 if e.condition == "conflict":
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1008 log.info(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1009 _("Service's profile JID {profile_jid} already exists")
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1010 .format(profile_jid=service_profile_jid_s)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1011 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1012 elif e.classname == "UnknownMethod":
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1013 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1014 C.EXIT_BRIDGE_ERROR,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1015 _("Can't create service profile XMPP account, In-Band "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1016 "Registration plugin is not activated, you'll have to "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1017 "create the {profile!r} profile with {profile_jid!r} JID "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1018 "manually.").format(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1019 profile=C.SERVICE_PROFILE,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1020 profile_jid=service_profile_jid_s)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1021 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1022 elif e.condition == "service-unavailable":
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1023 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1024 C.EXIT_BRIDGE_ERROR,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1025 _("Can't create service profile XMPP account, In-Band "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1026 "Registration is not activated on your server, you'll have "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1027 "to create the {profile!r} profile with {profile_jid!r} JID "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1028 "manually.\nNote that you'll need to activate In-Band "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1029 "Registation on your server if you want users to be able "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1030 "to create new account from {app_name}, please check "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1031 "documentation.").format(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1032 profile=C.SERVICE_PROFILE,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1033 profile_jid=service_profile_jid_s,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1034 app_name=C.APP_NAME)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1035 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1036 elif e.condition == "not-acceptable":
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1037 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1038 C.EXIT_BRIDGE_ERROR,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1039 _("Can't create service profile XMPP account, your XMPP "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1040 "server doesn't allow us to create new accounts with "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1041 "In-Band Registration please check XMPP server "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1042 "configuration: {reason}"
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1043 ).format(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1044 profile=C.SERVICE_PROFILE,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1045 profile_jid=service_profile_jid_s,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1046 reason=e.message)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1047 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1048
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1049 else:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1050 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1051 C.EXIT_BRIDGE_ERROR,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1052 _("Can't create service profile XMPP account, you'll have "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1053 "do to it manually: {reason}").format(reason=e.message)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1054 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1055 try:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1056 await self.bridgeCall("profileCreate", C.SERVICE_PROFILE, passphrase)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1057 await self.bridgeCall(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1058 "profileStartSession", passphrase, C.SERVICE_PROFILE)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1059 await self.bridgeCall(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1060 "setParam", "JabberID", service_profile_jid_s, "Connection", -1,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1061 C.SERVICE_PROFILE)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1062 await self.bridgeCall(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1063 "setParam", "Password", passphrase, "Connection", -1,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1064 C.SERVICE_PROFILE)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1065 except BridgeException as e:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1066 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1067 C.EXIT_BRIDGE_ERROR,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1068 _("Can't create service profile XMPP account, you'll have "
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1069 "do to it manually: {reason}").format(reason=e.message)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1070 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1071 log.info(_("Service profile has been successfully created"))
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1072 s_prof_connected = False
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1073 else:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1074 raise SysExit(C.EXIT_BRIDGE_ERROR, e.message)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1075
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1076 if not s_prof_connected:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1077 try:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1078 await self.bridgeCall(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1079 "connect",
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1080 C.SERVICE_PROFILE,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1081 passphrase,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1082 {},
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1083 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1084 except BridgeException as e:
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1085 raise SysExit(
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1086 C.EXIT_BRIDGE_ERROR,
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1087 _("Connection of service profile failed: {reason}").format(reason=e)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1088 )
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1089
1245
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1090 async def backendReady(self):
1397
ed037818d6de core (constants): renaming following global project renaming
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
1091 log.info(f"Libervia Web v{self.full_version}")
1362
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1092
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1093 # settings
1364
df40708c4c76 server: renamed `--dev_mode` to `--dev-mode` and set it as a flag:
Goffi <goffi@goffi.org>
parents: 1362
diff changeset
1094 if self.options['dev-mode']:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1095 log.info(_("Developer mode activated"))
1362
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1096 self.media_dir = await self.bridgeCall("getConfig", "", "media_dir")
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1097 self.local_dir = await self.bridgeCall("getConfig", "", "local_dir")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1098 self.cache_root_dir = os.path.join(self.local_dir, C.CACHE_DIR)
1132
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
1099 self.renderer = template.Renderer(self, self._front_url_filter)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1100 sites_names = list(self.renderer.sites_paths.keys())
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1101
1132
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
1102 self._moveFirstLevelToDict(self.options, "url_redirections_dict", sites_names)
0cafb79ced6d server: use site names in _moveFirstLevelToDict to better distinguish values for default site at first level + better handling of default menu
Goffi <goffi@goffi.org>
parents: 1131
diff changeset
1103 self._moveFirstLevelToDict(self.options, "menu_json", sites_names)
1359
2da573bf3f8b server: new `menu_extra_json` configuration option:
Goffi <goffi@goffi.org>
parents: 1354
diff changeset
1104 self._moveFirstLevelToDict(self.options, "menu_extra_json", sites_names)
2da573bf3f8b server: new `menu_extra_json` configuration option:
Goffi <goffi@goffi.org>
parents: 1354
diff changeset
1105 menu = self.options["menu_json"]
2da573bf3f8b server: new `menu_extra_json` configuration option:
Goffi <goffi@goffi.org>
parents: 1354
diff changeset
1106 if not '' in menu:
2da573bf3f8b server: new `menu_extra_json` configuration option:
Goffi <goffi@goffi.org>
parents: 1354
diff changeset
1107 menu[''] = C.DEFAULT_MENU
2da573bf3f8b server: new `menu_extra_json` configuration option:
Goffi <goffi@goffi.org>
parents: 1354
diff changeset
1108 for site, value in self.options["menu_extra_json"].items():
2da573bf3f8b server: new `menu_extra_json` configuration option:
Goffi <goffi@goffi.org>
parents: 1354
diff changeset
1109 menu[site].extend(value)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1110
1362
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1111 # service profile
1370
2d6cfce0df6c server: typo
Goffi <goffi@goffi.org>
parents: 1369
diff changeset
1112 if not self.options['build-only']:
1369
b5f2565c4bac server: don't check or connect service profile when `--build-only` is set
Goffi <goffi@goffi.org>
parents: 1368
diff changeset
1113 await self.checkAndConnectServiceProfile()
1362
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1114
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1115 # restricted bridge, the one used by browser code
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1116 self.restricted_bridge = RestrictedBridge(self)
45ebeea1bacd server: improved service profile check + auto creation:
Goffi <goffi@goffi.org>
parents: 1361
diff changeset
1117
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1118 # we create virtual hosts and import Libervia pages into them
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1119 self.vhost_root = vhost.NameVirtualHost()
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1251
diff changeset
1120 default_site_path = Path(libervia.__file__).parent.resolve()
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1121 # self.sat_root is official Libervia site
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1251
diff changeset
1122 root_path = default_site_path / C.TEMPLATE_STATIC_DIR
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1123 self.sat_root = default_root = LiberviaRootResource(
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1124 host=self, host_name='', site_name='',
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1125 site_path=default_site_path, path=root_path)
1364
df40708c4c76 server: renamed `--dev_mode` to `--dev-mode` and set it as a flag:
Goffi <goffi@goffi.org>
parents: 1362
diff changeset
1126 if self.options['dev-mode']:
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1127 self.files_watcher.watchDir(
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1128 default_site_path, auto_add=True, recursive=True,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1129 callback=LiberviaPage.onFileChange, site_root=self.sat_root,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1130 site_path=default_site_path)
1245
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1131 LiberviaPage.importPages(self, self.sat_root)
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1132 tasks_manager = TasksManager(self, self.sat_root)
1245
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1133 await tasks_manager.parseTasks()
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1134 await tasks_manager.runTasks()
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1135 # FIXME: handle _setMenu in a more generic way, taking care of external sites
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
1136 await self.sat_root._setMenu(self.options["menu_json"])
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1137 self.vhost_root.default = default_root
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1138 existing_vhosts = {b'': default_root}
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1139
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1140 for host_name, site_name in self.options["vhosts_dict"].items():
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1141 if site_name == C.SITE_NAME_DEFAULT:
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1142 raise ValueError(
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1143 f"{C.DEFAULT_SITE_NAME} is reserved and can't be used in vhosts_dict")
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1144 encoded_site_name = site_name.encode('utf-8')
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1145 try:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1146 site_path = self.renderer.sites_paths[site_name]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1147 except KeyError:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1148 log.warning(_(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1149 "host {host_name} link to non existing site {site_name}, ignoring "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1150 "it").format(host_name=host_name, site_name=site_name))
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1151 continue
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1152 if encoded_site_name in existing_vhosts:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1153 # we have an alias host, we re-use existing resource
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1154 res = existing_vhosts[encoded_site_name]
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1155 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1156 # for root path we first check if there is a global static dir
1257
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1157 # if not, we use default template's static dir
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1158 root_path = os.path.join(site_path, C.TEMPLATE_STATIC_DIR)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1159 if not os.path.isdir(root_path):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1160 root_path = os.path.join(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1161 site_path, C.TEMPLATE_TPL_DIR, C.TEMPLATE_THEME_DEFAULT,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1162 C.TEMPLATE_STATIC_DIR)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1163 res = LiberviaRootResource(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1164 host=self,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1165 host_name=host_name,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1166 site_name=site_name,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1167 site_path=site_path,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1168 path=root_path)
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1169
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1170 existing_vhosts[encoded_site_name] = res
1191
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1171
1364
df40708c4c76 server: renamed `--dev_mode` to `--dev-mode` and set it as a flag:
Goffi <goffi@goffi.org>
parents: 1362
diff changeset
1172 if self.options['dev-mode']:
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1173 self.files_watcher.watchDir(
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1174 site_path, auto_add=True, recursive=True,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1175 callback=LiberviaPage.onFileChange, site_root=res,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1152
diff changeset
1176 site_path=site_path)
1191
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1177
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1178 LiberviaPage.importPages(self, res)
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1179 # FIXME: default pages are accessible if not overriden by external website
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1180 # while necessary for login or re-using existing pages
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1181 # we may want to disable access to the page by direct URL
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1182 # (e.g. /blog disabled except if called by external site)
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1183 LiberviaPage.importPages(self, res, root_path=default_site_path)
1245
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1184 tasks_manager = TasksManager(self, res)
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1185 await tasks_manager.parseTasks()
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1186 await tasks_manager.runTasks()
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
1187 await res._setMenu(self.options["menu_json"])
1191
ba45dcdbeeaf server: fixed sites alias:
Goffi <goffi@goffi.org>
parents: 1184
diff changeset
1188
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1189 self.vhost_root.addHost(host_name.encode('utf-8'), res)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1190
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1191 templates_res = web_resource.Resource()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1192 self.putChildAll(C.TPL_RESOURCE.encode('utf-8'), templates_res)
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1193 for site_name, site_path in self.renderer.sites_paths.items():
1292
e30e96958fb7 server: use C.SITE_NAME_DEFAULT instead of "sat" when suitable
Goffi <goffi@goffi.org>
parents: 1287
diff changeset
1194 templates_res.putChild(site_name.encode() or C.SITE_NAME_DEFAULT.encode(),
e30e96958fb7 server: use C.SITE_NAME_DEFAULT instead of "sat" when suitable
Goffi <goffi@goffi.org>
parents: 1287
diff changeset
1195 static.File(site_path))
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1196
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1197 d = self.bridgeCall("namespacesGet")
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1198 d.addCallback(self._namespacesGetCb)
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1199 d.addErrback(self._namespacesGetEb)
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
1200
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1201 # websocket
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1202 if self.options["connection_type"] in ("https", "both"):
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1203 wss = websockets.LiberviaPageWSProtocol.getResource(secure=True)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1204 self.putChildAll(b'wss', wss)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1205 if self.options["connection_type"] in ("http", "both"):
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1206 ws = websockets.LiberviaPageWSProtocol.getResource(secure=False)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1207 self.putChildAll(b'ws', ws)
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1208
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1209 ## following signal is needed for cache handling in Libervia pages
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1210 self.bridge.register_signal(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1211 "psEventRaw", partial(LiberviaPage.onNodeEvent, self), "plugin"
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1212 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1213 self.bridge.register_signal(
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1214 "messageNew", partial(self.on_signal, "messageNew")
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1215 )
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1216
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1217 #  Progress handling
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1218 self.bridge.register_signal(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1219 "progressStarted", partial(ProgressHandler._signal, "started")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1220 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1221 self.bridge.register_signal(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1222 "progressFinished", partial(ProgressHandler._signal, "finished")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1223 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1224 self.bridge.register_signal(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1225 "progressError", partial(ProgressHandler._signal, "error")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1226 )
1063
4b69f69c6ffd server: new ProgressHandler helper class, to handle progressing actions
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
1227
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1228 # media dirs
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1229 # FIXME: get rid of dirname and "/" in C.XXX_DIR
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1230 self.putChildAll(os.path.dirname(C.MEDIA_DIR).encode('utf-8'),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1231 ProtectedFile(self.media_dir))
1242
8f39d98416c5 server: added a child for common cache
Goffi <goffi@goffi.org>
parents: 1240
diff changeset
1232
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1233 self.cache_resource = web_resource.NoResource()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1234 self.putChildAll(C.CACHE_DIR.encode('utf-8'), self.cache_resource)
1242
8f39d98416c5 server: added a child for common cache
Goffi <goffi@goffi.org>
parents: 1240
diff changeset
1235 self.cache_resource.putChild(
8f39d98416c5 server: added a child for common cache
Goffi <goffi@goffi.org>
parents: 1240
diff changeset
1236 b"common", ProtectedFile(str(self.cache_root_dir / Path("common"))))
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
1237
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
1238 # redirections
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1239 for root in self.roots:
1360
389a83eefe62 server: SàT applications integration:
Goffi <goffi@goffi.org>
parents: 1359
diff changeset
1240 await root._initRedirections(self.options)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1241
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1242 # no need to keep url_redirections_dict, it will not be used anymore
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1243 del self.options["url_redirections_dict"]
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
1244
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1245 server.Request.defaultContentType = "text/html; charset=utf-8"
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1246 wrapped = web_resource.EncodingResourceWrapper(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1247 self.vhost_root, [server.GzipEncoderFactory()]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1248 )
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1249 self.site = server.Site(wrapped)
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1250 self.site.sessionFactory = LiberviaSession
444
b64e528fb524 server side: use of bridge's getReady to be sure that backend is initialised at launch
Goffi <goffi@goffi.org>
parents: 438
diff changeset
1251
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1252 def _bridgeCb(self):
1367
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1253 del self._bridge_retry
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1254 self.bridge.getReady(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1255 lambda: self.initialised.callback(None),
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1256 lambda failure: self.initialised.errback(Exception(failure)),
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1257 )
1245
079e8eb6e327 server (tasks): refactoring:
Goffi <goffi@goffi.org>
parents: 1242
diff changeset
1258 self.initialised.addCallback(lambda __: defer.ensureDeferred(self.backendReady()))
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1259
1126
7cd89277a129 server: fixed missing backend detection
Goffi <goffi@goffi.org>
parents: 1124
diff changeset
1260 def _bridgeEb(self, failure_):
7cd89277a129 server: fixed missing backend detection
Goffi <goffi@goffi.org>
parents: 1124
diff changeset
1261 if isinstance(failure_, BridgeExceptionNoService):
1367
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1262 if self._bridge_retry:
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1263 if self._bridge_retry < 0:
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1264 print(_("Can't connect to bridge, will retry indefinitely. "
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1265 "Next try in 1s."))
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1266 else:
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1267 self._bridge_retry -= 1
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1268 print(
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1269 _(
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1270 "Can't connect to bridge, will retry in 1 s ({retries_left} "
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1271 "trie(s) left)."
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1272 ).format(retries_left=self._bridge_retry)
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1273 )
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1274 time.sleep(1)
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1275 self.bridge.bridgeConnect(callback=self._bridgeCb, errback=self._bridgeEb)
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1276 return
ce5cfe004d4e server: new `--bridge-retries` option:
Goffi <goffi@goffi.org>
parents: 1365
diff changeset
1277
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1278 print("Can't connect to SàT backend, are you sure it's launched ?")
1126
7cd89277a129 server: fixed missing backend detection
Goffi <goffi@goffi.org>
parents: 1124
diff changeset
1279 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1280 log.error("Can't connect to bridge: {}".format(failure))
1126
7cd89277a129 server: fixed missing backend detection
Goffi <goffi@goffi.org>
parents: 1124
diff changeset
1281 sys.exit(1)
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1282
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1283 @property
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1284 def version(self):
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1285 """Return the short version of Libervia"""
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1286 return C.APP_VERSION
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1287
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1288 @property
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1289 def full_version(self):
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1290 """Return the full version of Libervia (with extra data when in dev mode)"""
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1291 version = self.version
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1292 if version[-1] == "D":
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1293 # we are in debug version, we add extra data
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1294 try:
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1295 return self._version_cache
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1296 except AttributeError:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1297 self._version_cache = "{} ({})".format(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1298 version, utils.getRepositoryData(libervia)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1299 )
682
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1300 return self._version_cache
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1301 else:
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1302 return version
e6bb64bd6b4d server side: implemented methods to get SàT and Libervia versions
Goffi <goffi@goffi.org>
parents: 679
diff changeset
1303
935
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1304 def bridgeCall(self, method_name, *args, **kwargs):
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1305 """Call an asynchronous bridge method and return a deferred
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1306
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1307 @param method_name: name of the method as a unicode
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1308 @return: a deferred which trigger the result
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1309
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1310 """
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1311 d = defer.Deferred()
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1312
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1313 def _callback(*args):
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1314 if not args:
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1315 d.callback(None)
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1316 else:
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1317 if len(args) != 1:
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1318 Exception("Multiple return arguments not supported")
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1319 d.callback(args[0])
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1320
1138
ef565839dada server: don't convert failure in errback to jsonrpclib.Fault anymore:
Goffi <goffi@goffi.org>
parents: 1132
diff changeset
1321 def _errback(failure_):
ef565839dada server: don't convert failure in errback to jsonrpclib.Fault anymore:
Goffi <goffi@goffi.org>
parents: 1132
diff changeset
1322 d.errback(failure.Failure(failure_))
935
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1323
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1324 kwargs["callback"] = _callback
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1325 kwargs["errback"] = _errback
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1326 getattr(self.bridge, method_name)(*args, **kwargs)
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1327 return d
c3ae008f7a0f server: move asyncBridgeCall to Libervia.bridgeCall, this way async bridge calls can be used easily everywhere.
Goffi <goffi@goffi.org>
parents: 931
diff changeset
1328
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1329 def on_signal(self, signal_name, *args):
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1330 profile = args[-1]
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1331 if not profile:
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1332 log.error(f"got signal without profile: {signal_name}, {args}")
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1333 return
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1334 try:
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1335 sockets = websockets.LiberviaPageWSProtocol.profile_map[profile]
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1336 except KeyError:
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1337 log.debug(f"no socket opened for profile {profile}")
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1338 return
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1339 for socket in sockets:
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1340 socket.send("bridge", {"signal": signal_name, "args": args})
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1341
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1342 async def _logged(self, profile, request):
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1343 """Set everything when a user just logged in
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1344
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1345 @param profile
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1346 @param request
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1347 @return: a constant indicating the state:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1348 - C.PROFILE_LOGGED
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1349 - C.PROFILE_LOGGED_EXT_JID
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1350 @raise exceptions.ConflictError: session is already active
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1351 """
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1352 register_with_ext_jid = self.waiting_profiles.getRegisterWithExtJid(profile)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1353 self.waiting_profiles.purgeRequest(profile)
1090
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1066
diff changeset
1354 session = request.getSession()
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1066
diff changeset
1355 sat_session = session_iface.ISATSession(session)
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1356 if sat_session.profile:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1357 log.error(_("/!\\ Session has already a profile, this should NEVER happen!"))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1358 raise failure.Failure(exceptions.ConflictError("Already active"))
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1359
1305
db9ea167c409 pages: `profile` is now exposed to scripts
Goffi <goffi@goffi.org>
parents: 1293
diff changeset
1360 # XXX: we force string because python D-Bus has its own string type (dbus.String)
db9ea167c409 pages: `profile` is now exposed to scripts
Goffi <goffi@goffi.org>
parents: 1293
diff changeset
1361 # which may cause trouble when exposing it to scripts
db9ea167c409 pages: `profile` is now exposed to scripts
Goffi <goffi@goffi.org>
parents: 1293
diff changeset
1362 sat_session.profile = str(profile)
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1363 self.prof_connected.add(profile)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1364 cache_dir = os.path.join(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1365 self.cache_root_dir, "profiles", regex.pathEscape(profile)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1366 )
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1367 # FIXME: would be better to have a global /cache URL which redirect to
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1368 # profile's cache directory, without uuid
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1369 self.cache_resource.putChild(sat_session.uuid.encode('utf-8'),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1370 ProtectedFile(cache_dir))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1371 log.debug(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1372 _("profile cache resource added from {uuid} to {path}").format(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1373 uuid=sat_session.uuid, path=cache_dir
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1374 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1375 )
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1376
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1377 def on_expire():
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1378 log.info("Session expired (profile={profile})".format(profile=profile))
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1379 self.cache_resource.delEntity(sat_session.uuid.encode('utf-8'))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1380 log.debug(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1381 _("profile cache resource {uuid} deleted").format(uuid=sat_session.uuid)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1382 )
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1383 sat_session.on_expire()
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1384 if sat_session.ws_socket is not None:
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1385 sat_session.ws_socket.close()
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1386 # and now we disconnect the profile
1098
01e95ec9df9e server, pages: fixed blocking calls to bridge by using bridgeCall instead
Goffi <goffi@goffi.org>
parents: 1093
diff changeset
1387 self.bridgeCall("disconnect", profile)
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1388
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1389 session.notifyOnExpire(on_expire)
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1390
1090
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1066
diff changeset
1391 # FIXME: those session infos should be returned by connect or isConnected
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1392 infos = await self.bridgeCall("sessionInfosGet", profile)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1393 sat_session.jid = jid.JID(infos["jid"])
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1394 own_bare_jid_s = sat_session.jid.userhost()
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1395 own_id_raw = await self.bridgeCall(
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1396 "identityGet", own_bare_jid_s, [], True, profile)
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1397 sat_session.identities[own_bare_jid_s] = data_format.deserialise(own_id_raw)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1398 sat_session.backend_started = int(infos["started"])
1090
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1066
diff changeset
1399
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1066
diff changeset
1400 state = C.PROFILE_LOGGED_EXT_JID if register_with_ext_jid else C.PROFILE_LOGGED
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1401 return state
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1402
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1403 @defer.inlineCallbacks
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1404 def connect(self, request, login, password):
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1405 """log user in
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1406
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1407 If an other user was already logged, it will be unlogged first
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1408 @param request(server.Request): request linked to the session
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1409 @param login(unicode): user login
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1410 can be profile name
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1411 can be profile@[libervia_domain.ext]
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1412 can be a jid (a new profile will be created with this jid if needed)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1413 @param password(unicode): user password
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1414 @return (unicode, None): C.SESSION_ACTIVE: if session was aleady active else
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1415 self._logged value
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1416 @raise exceptions.DataError: invalid login
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1417 @raise exceptions.ProfileUnknownError: this login doesn't exist
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1418 @raise exceptions.PermissionError: a login is not accepted (e.g. empty password
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1419 not allowed)
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1420 @raise exceptions.NotReady: a profile connection is already waiting
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1421 @raise exceptions.TimeoutError: didn't received and answer from Bridge
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1422 @raise exceptions.InternalError: unknown error
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1423 @raise ValueError(C.PROFILE_AUTH_ERROR): invalid login and/or password
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1424 @raise ValueError(C.XMPP_AUTH_ERROR): invalid XMPP account password
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1425 """
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1426
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1427 # XXX: all security checks must be done here, even if present in javascript
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1428 if login.startswith("@"):
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1429 raise failure.Failure(exceptions.DataError("No profile_key allowed"))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1430
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1431 if login.startswith("guest@@") and login.count("@") == 2:
1100
5976dcd42591 pages (g): use server's connect method to connect instead of bridge, this way normal Libervia workflow is used, and session attributes are initialised.
Goffi <goffi@goffi.org>
parents: 1099
diff changeset
1432 log.debug("logging a guest account")
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1433 elif "@" in login:
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1434 if login.count("@") != 1:
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1435 raise failure.Failure(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1436 exceptions.DataError("Invalid login: {login}".format(login=login))
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1437 )
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1438 try:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1439 login_jid = jid.JID(login)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1440 except (RuntimeError, jid.InvalidFormat, AttributeError):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1441 raise failure.Failure(exceptions.DataError("No profile_key allowed"))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1442
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1443 # FIXME: should it be cached?
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1444 new_account_domain = yield self.bridgeCall("getNewAccountDomain")
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1445
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1446 if login_jid.host == new_account_domain:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1447 # redirect "user@libervia.org" to the "user" profile
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1448 login = login_jid.user
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1449 login_jid = None
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1450 else:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1451 login_jid = None
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1452
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1453 try:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1454 profile = yield self.bridgeCall("profileNameGet", login)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1455 except Exception: # XXX: ProfileUnknownError wouldn't work, it's encapsulated
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1456 # FIXME: find a better way to handle bridge errors
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1457 if (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1458 login_jid is not None and login_jid.user
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1459 ): # try to create a new sat profile using the XMPP credentials
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1460 if not self.options["allow_registration"]:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1461 log.warning(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1462 "Trying to register JID account while registration is not "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1463 "allowed")
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1464 raise failure.Failure(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1465 exceptions.DataError(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1466 "JID login while registration is not allowed"
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1467 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1468 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1469 profile = login # FIXME: what if there is a resource?
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1470 connect_method = "asyncConnectWithXMPPCredentials"
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1471 register_with_ext_jid = True
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1472 else: # non existing username
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1473 raise failure.Failure(exceptions.ProfileUnknownError())
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1474 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1475 if profile != login or (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1476 not password
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1477 and profile
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1478 not in self.options["empty_password_allowed_warning_dangerous_list"]
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1479 ):
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1480 # profiles with empty passwords are restricted to local frontends
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1481 raise exceptions.PermissionError
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1482 register_with_ext_jid = False
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1483
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1484 connect_method = "connect"
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1485
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1486 # we check if there is not already an active session
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1487 sat_session = session_iface.ISATSession(request.getSession())
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1488 if sat_session.profile:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1489 # yes, there is
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1490 if sat_session.profile != profile:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1491 # it's a different profile, we need to disconnect it
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1492 log.warning(_(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1493 "{new_profile} requested login, but {old_profile} was already "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1494 "connected, disconnecting {old_profile}").format(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1495 old_profile=sat_session.profile, new_profile=profile))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1496 self.purgeSession(request)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1497
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1498 if self.waiting_profiles.getRequest(profile):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1499 #  FIXME: check if and when this can happen
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1500 raise failure.Failure(exceptions.NotReady("Already waiting"))
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1501
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1502 self.waiting_profiles.setRequest(request, profile, register_with_ext_jid)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1503 try:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1504 connected = yield self.bridgeCall(connect_method, profile, password)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1505 except Exception as failure_:
1204
a2df53dfbf46 server: handle unexpected exceptions on connect:
Goffi <goffi@goffi.org>
parents: 1203
diff changeset
1506 fault = getattr(failure_, 'classname', None)
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1507 self.waiting_profiles.purgeRequest(profile)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1508 if fault in ("PasswordError", "ProfileUnknownError"):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1509 log.info("Profile {profile} doesn't exist or the submitted password is "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1510 "wrong".format( profile=profile))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1511 raise failure.Failure(ValueError(C.PROFILE_AUTH_ERROR))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1512 elif fault == "SASLAuthError":
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1513 log.info("The XMPP password of profile {profile} is wrong"
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1514 .format(profile=profile))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1515 raise failure.Failure(ValueError(C.XMPP_AUTH_ERROR))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1516 elif fault == "NoReply":
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1517 log.info(_("Did not receive a reply (the timeout expired or the "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1518 "connection is broken)"))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1519 raise exceptions.TimeOutError
1204
a2df53dfbf46 server: handle unexpected exceptions on connect:
Goffi <goffi@goffi.org>
parents: 1203
diff changeset
1520 elif fault is None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1521 log.info(_("Unexepected failure: {failure_}").format(failure_=failure))
1204
a2df53dfbf46 server: handle unexpected exceptions on connect:
Goffi <goffi@goffi.org>
parents: 1203
diff changeset
1522 raise failure_
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1523 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1524 log.error('Unmanaged fault class "{fault}" in errback for the '
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1525 'connection of profile {profile}'.format(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1526 fault=fault, profile=profile))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1527 raise failure.Failure(exceptions.InternalError(fault))
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1528
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1529 if connected:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1530 #  profile is already connected in backend
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1531 # do we have a corresponding session in Libervia?
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1532 sat_session = session_iface.ISATSession(request.getSession())
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1533 if sat_session.profile:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1534 # yes, session is active
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1535 if sat_session.profile != profile:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1536 # existing session should have been ended above
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1537 # so this line should never be reached
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1538 log.error(_(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1539 "session profile [{session_profile}] differs from login "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1540 "profile [{profile}], this should not happen!")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1541 .format(session_profile=sat_session.profile, profile=profile))
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1542 raise exceptions.InternalError("profile mismatch")
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1543 defer.returnValue(C.SESSION_ACTIVE)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1544 log.info(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1545 _(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1546 "profile {profile} was already connected in backend".format(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1547 profile=profile
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1548 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1549 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1550 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1551 #  no, we have to create it
1090
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1066
diff changeset
1552
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1553 state = yield defer.ensureDeferred(self._logged(profile, request))
1090
9c41b7e91172 server: set jid and started time in session on log-in:
Goffi <goffi@goffi.org>
parents: 1066
diff changeset
1554 defer.returnValue(state)
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1555
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1556 def registerNewAccount(self, request, login, password, email):
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1557 """Create a new account, or return error
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1558 @param request(server.Request): request linked to the session
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1559 @param login(unicode): new account requested login
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1560 @param email(unicode): new account email
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1561 @param password(unicode): new account password
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1562 @return(unicode): a constant indicating the state:
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1563 - C.BAD_REQUEST: something is wrong in the request (bad arguments)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1564 - C.INVALID_INPUT: one of the data is not valid
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1565 - C.REGISTRATION_SUCCEED: new account has been successfully registered
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1566 - C.ALREADY_EXISTS: the given profile already exists
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1567 - C.INTERNAL_ERROR or any unmanaged fault string
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1568 @raise PermissionError: registration is now allowed in server configuration
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1569 """
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1570 if not self.options["allow_registration"]:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1571 log.warning(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1572 _("Registration received while it is not allowed, hack attempt?")
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1573 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1574 raise failure.Failure(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1575 exceptions.PermissionError("Registration is not allowed on this server")
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1576 )
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1577
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1578 if (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1579 not re.match(C.REG_LOGIN_RE, login)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1580 or not re.match(C.REG_EMAIL_RE, email, re.IGNORECASE)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1581 or len(password) < C.PASSWORD_MIN_LENGTH
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1582 ):
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1583 return C.INVALID_INPUT
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1584
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1585 def registered(result):
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1586 return C.REGISTRATION_SUCCEED
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1587
1184
eee7a896cf0e server: show BridgeException traceback on unknown registering status
Goffi <goffi@goffi.org>
parents: 1182
diff changeset
1588 def registeringError(failure_):
1164
ef3adc3f2078 handle invalid certificate on registration + fixed error handling on registration
Goffi <goffi@goffi.org>
parents: 1158
diff changeset
1589 # FIXME: better error handling for bridge error is needed
1184
eee7a896cf0e server: show BridgeException traceback on unknown registering status
Goffi <goffi@goffi.org>
parents: 1182
diff changeset
1590 status = failure_.value.fullname.split('.')[-1]
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1591 if status == "ConflictError":
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1592 return C.ALREADY_EXISTS
1164
ef3adc3f2078 handle invalid certificate on registration + fixed error handling on registration
Goffi <goffi@goffi.org>
parents: 1158
diff changeset
1593 elif status == "InvalidCertificate":
ef3adc3f2078 handle invalid certificate on registration + fixed error handling on registration
Goffi <goffi@goffi.org>
parents: 1158
diff changeset
1594 return C.INVALID_CERTIFICATE
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1595 elif status == "InternalError":
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1596 return C.INTERNAL_ERROR
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1597 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1598 log.error(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1599 _("Unknown registering error status: {status}\n{traceback}").format(
1184
eee7a896cf0e server: show BridgeException traceback on unknown registering status
Goffi <goffi@goffi.org>
parents: 1182
diff changeset
1600 status=status, traceback=failure_.value.message
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1601 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1602 )
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1603 return status
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1604
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1605 d = self.bridgeCall("registerSatAccount", email, password, login)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1606 d.addCallback(registered)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1607 d.addErrback(registeringError)
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1608 return d
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1609
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1610 def addCleanup(self, callback, *args, **kwargs):
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1611 """Add cleaning method to call when service is stopped
961
22fe06569b1a server: moved logging worflow in separated method, so it can be used by Libervia Pages
Goffi <goffi@goffi.org>
parents: 959
diff changeset
1612
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1613 cleaning method will be called in reverse order of they insertion
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1614 @param callback: callable to call on service stop
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1615 @param *args: list of arguments of the callback
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1616 @param **kwargs: list of keyword arguments of the callback"""
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1617 self._cleanup.insert(0, (callback, args, kwargs))
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1618
1361
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1619 def initEb(self, failure):
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1620 from twisted.application import app
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1621 if failure.check(SysExit):
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1622 if failure.value.message:
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1623 log.error(failure.value.message)
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1624 app._exitCode = failure.value.exit_code
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1625 reactor.stop()
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1626 else:
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1627 log.error(_("Init error: {msg}").format(msg=failure))
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1628 app._exitCode = C.EXIT_INTERNAL_ERROR
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1629 reactor.stop()
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1630 return failure
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1631
1368
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1632 def _buildOnlyCb(self, __):
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1633 log.info(_("Stopping here due to --build-only flag"))
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1634 self.stop()
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1635
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1636 def startService(self):
446
c406e46fe9c0 server_side: update the connection mechanism to handle profile passwords
souliane <souliane@mailoo.org>
parents: 445
diff changeset
1637 """Connect the profile for Libervia and start the HTTP(S) server(s)"""
1236
352e189ab7f8 server: avoid double init
Goffi <goffi@goffi.org>
parents: 1235
diff changeset
1638 self._init()
1368
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1639 if self.options['build-only']:
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1640 self.initialised.addCallback(self._buildOnlyCb)
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1641 else:
9624c2a89a92 server: new `--build-only` flag:
Goffi <goffi@goffi.org>
parents: 1367
diff changeset
1642 self.initialised.addCallback(self._startService)
1361
626b7bbb7f90 server: mechanism to exit Libervia with an exit code:
Goffi <goffi@goffi.org>
parents: 1360
diff changeset
1643 self.initialised.addErrback(self.initEb)
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1644
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1645 ## URLs ##
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents: 917
diff changeset
1646
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1647 def putChildSAT(self, path, resource):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1648 """Add a child to the sat resource"""
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1649 if not isinstance(path, bytes):
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1650 raise ValueError("path must be specified in bytes")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1651 self.sat_root.putChild(path, resource)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1652
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1653 def putChildAll(self, path, resource):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1654 """Add a child to all vhost root resources"""
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1655 if not isinstance(path, bytes):
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1656 raise ValueError("path must be specified in bytes")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1657 # we wrap before calling putChild, to avoid having useless multiple instances
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1658 # of the resource
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1659 # FIXME: check that no information is leaked (c.f. https://twistedmatrix.com/documents/current/web/howto/using-twistedweb.html#request-encoders)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1660 wrapped_res = web_resource.EncodingResourceWrapper(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1661 resource, [server.GzipEncoderFactory()])
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1662 for root in self.roots:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1663 root.putChild(path, wrapped_res)
914
0c0551967bdf server, browser: partial Libervia fix
Goffi <goffi@goffi.org>
parents: 913
diff changeset
1664
1257
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1665 def getBuildPath(self, site_name: str, dev: bool=False) -> Path:
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1666 """Generate build path for a given site name
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1667
1257
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1668 @param site_name: name of the site
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1669 @param dev: return dev build dir if True, production one otherwise
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1670 dev build dir is used for installing dependencies needed temporarily (e.g.
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1671 to compile files), while production build path is the one served by the
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1672 HTTP server, where final files are downloaded.
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1673 @return: path to the build directory
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1674 """
1257
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1675 sub_dir = C.DEV_BUILD_DIR if dev else C.PRODUCTION_BUILD_DIR
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1676 build_path_elts = [
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1677 config.getConfig(self.main_conf, "", "local_dir"),
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1678 C.CACHE_DIR,
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1679 C.LIBERVIA_CACHE,
1257
1ec41ac1e7cf server: seperation between production build dir and dev build dir:
Goffi <goffi@goffi.org>
parents: 1256
diff changeset
1680 sub_dir,
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1681 regex.pathEscape(site_name or C.SITE_NAME_DEFAULT)]
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1682 build_path = Path("/".join(build_path_elts))
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1245
diff changeset
1683 return build_path.expanduser().resolve()
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1684
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1685 def getExtBaseURLData(self, request):
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1686 """Retrieve external base URL Data
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1687
1435
396d5606477f server (proxy): add "Forwarded" and "X-Forwarded-xxx" headers to reverse proxy
Goffi <goffi@goffi.org>
parents: 1397
diff changeset
1688 this method try to retrieve the base URL found by external user
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1689 It does by checking in this order:
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1690 - base_url_ext option from configuration
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1691 - proxy x-forwarder-host headers
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1692 - URL of the request
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1693 @return (urlparse.SplitResult): SplitResult instance with only scheme and
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1694 netloc filled
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1695 """
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1696 ext_data = self.base_url_ext_data
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1697 url_path = request.URLPath()
1467
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1698
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1699 try:
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1700 forwarded = request.requestHeaders.getRawHeaders(
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1701 "forwarded"
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1702 )[0]
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1703 except TypeError:
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1704 # we try deprecated headers
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1705 try:
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1706 proxy_netloc = request.requestHeaders.getRawHeaders(
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1707 "x-forwarded-host"
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1708 )[0]
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1709 except TypeError:
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1710 proxy_netloc = None
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1711 try:
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1712 proxy_scheme = request.requestHeaders.getRawHeaders(
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1713 "x-forwarded-proto"
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1714 )[0]
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1715 except TypeError:
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1716 proxy_scheme = None
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1717 else:
1467
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1718 fwd_data = {
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1719 k.strip(): v.strip()
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1720 for k,v in (d.split("=") for d in forwarded.split(";"))
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1721 }
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1722 proxy_netloc = fwd_data.get("host")
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1723 proxy_scheme = fwd_data.get("proto")
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1724
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1725 return urllib.parse.SplitResult(
1467
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1726 ext_data.scheme or proxy_scheme or url_path.scheme.decode(),
d6062cccd4c0 server: better reverse proxy headers handling:
Goffi <goffi@goffi.org>
parents: 1462
diff changeset
1727 ext_data.netloc or proxy_netloc or url_path.netloc.decode(),
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1728 ext_data.path or "/",
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1729 "",
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1730 "",
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1731 )
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1732
1459
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1733 def getExtBaseURL(
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1734 self,
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1735 request: server.Request,
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1736 path: str = "",
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1737 query: str = "",
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1738 fragment: str = "",
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1739 scheme: Optional[str] = None,
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1740 ) -> str:
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1741 """Get external URL according to given elements
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1742
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1743 external URL is the URL seen by external user
1459
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1744 @param path: same as for urlsplit.urlsplit
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1745 path will be prefixed to follow found external URL if suitable
1459
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1746 @param params: same as for urlsplit.urlsplit
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1747 @param query: same as for urlsplit.urlsplit
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1748 @param fragment: same as for urlsplit.urlsplit
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1749 @param scheme: if not None, will override scheme from base URL
47db314e60ca server: `getExtBaseURL` type hints
Goffi <goffi@goffi.org>
parents: 1458
diff changeset
1750 @return: external URL
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1751 """
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1752 split_result = self.getExtBaseURLData(request)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1753 return urllib.parse.urlunsplit(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1754 (
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1755 split_result.scheme if scheme is None else scheme,
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1756 split_result.netloc,
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1757 os.path.join(split_result.path, path),
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1758 query,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1759 fragment,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1760 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1761 )
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1762
1458
db13f5c768a0 server: `checkRedirection`: fix range variable + type hints + arg name:
Goffi <goffi@goffi.org>
parents: 1457
diff changeset
1763 def checkRedirection(self, vhost_root: LiberviaRootResource, url_path: str) -> str:
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
1764 """check is a part of the URL prefix is redirected then replace it
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
1765
1458
db13f5c768a0 server: `checkRedirection`: fix range variable + type hints + arg name:
Goffi <goffi@goffi.org>
parents: 1457
diff changeset
1766 @param vhost_root: root of this virtual host
db13f5c768a0 server: `checkRedirection`: fix range variable + type hints + arg name:
Goffi <goffi@goffi.org>
parents: 1457
diff changeset
1767 @param url_path: path of the url to check
db13f5c768a0 server: `checkRedirection`: fix range variable + type hints + arg name:
Goffi <goffi@goffi.org>
parents: 1457
diff changeset
1768 @return: possibly redirected URL which should link to the same location
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
1769 """
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1770 inv_redirections = vhost_root.inv_redirections
1458
db13f5c768a0 server: `checkRedirection`: fix range variable + type hints + arg name:
Goffi <goffi@goffi.org>
parents: 1457
diff changeset
1771 url_parts = url_path.strip("/").split("/")
1475
83cd4862b134 server: fix args range in checkRedirection
Goffi <goffi@goffi.org>
parents: 1467
diff changeset
1772 for idx in range(len(url_parts), -1, -1):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1773 test_url = "/" + "/".join(url_parts[:idx])
1037
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
1774 if test_url in inv_redirections:
dc6c8c4d8ff6 server: redirection rework:
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
1775 rem_url = url_parts[idx:]
1099
ea0d41ef3719 server: return absolute page in checkRedirection
Goffi <goffi@goffi.org>
parents: 1098
diff changeset
1776 return os.path.join(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1777 "/", "/".join([inv_redirections[test_url]] + rem_url)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1778 )
1458
db13f5c768a0 server: `checkRedirection`: fix range variable + type hints + arg name:
Goffi <goffi@goffi.org>
parents: 1457
diff changeset
1779 return url_path
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1780
920
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1781 ## Sessions ##
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1782
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1783 def purgeSession(self, request):
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1784 """helper method to purge a session during request handling"""
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1785 session = request.session
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1786 if session is not None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1787 log.debug(_("session purge"))
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1788 sat_session = self.getSessionData(request, session_iface.ISATSession)
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1789 socket = sat_session.ws_socket
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1790 if socket is not None:
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1791 socket.close()
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1792 session.ws_socket = None
920
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1793 session.expire()
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1794 # FIXME: not clean but it seems that it's the best way to reset
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1795 # session during request handling
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1796 request._secureSession = request._insecureSession = None
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1797
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1798 def getSessionData(self, request, *args):
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1799 """helper method to retrieve session data
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1800
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1801 @param request(server.Request): request linked to the session
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1802 @param *args(zope.interface.Interface): interface of the session to get
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1803 @return (iterator(data)): requested session data
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1804 """
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1805 session = request.getSession()
924
94f88277c2e7 libervia (pages): getSessionData return one session if used with one argument, else an iterator
Goffi <goffi@goffi.org>
parents: 923
diff changeset
1806 if len(args) == 1:
94f88277c2e7 libervia (pages): getSessionData return one session if used with one argument, else an iterator
Goffi <goffi@goffi.org>
parents: 923
diff changeset
1807 return args[0](session)
94f88277c2e7 libervia (pages): getSessionData return one session if used with one argument, else an iterator
Goffi <goffi@goffi.org>
parents: 923
diff changeset
1808 else:
94f88277c2e7 libervia (pages): getSessionData return one session if used with one argument, else an iterator
Goffi <goffi@goffi.org>
parents: 923
diff changeset
1809 return (iface(session) for iface in args)
920
8cea8bf41b03 server: new purgeSession and getSessionData helper methods
Goffi <goffi@goffi.org>
parents: 919
diff changeset
1810
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1811 @defer.inlineCallbacks
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1812 def getAffiliation(self, request, service, node):
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1813 """retrieve pubsub node affiliation for current user
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1814
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1815 use cache first, and request pubsub service if not cache is found
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1816 @param request(server.Request): request linked to the session
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1817 @param service(jid.JID): pubsub service
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1818 @param node(unicode): pubsub node
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1819 @return (unicode): affiliation
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1820 """
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1821 sat_session = self.getSessionData(request, session_iface.ISATSession)
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1822 if sat_session.profile is None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1823 raise exceptions.InternalError("profile must be set to use this method")
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1824 affiliation = sat_session.getAffiliation(service, node)
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1825 if affiliation is not None:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1826 defer.returnValue(affiliation)
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1827 else:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1828 try:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1829 affiliations = yield self.bridgeCall(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1830 "psAffiliationsGet", service.full(), node, sat_session.profile
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1831 )
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1832 except Exception as e:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1833 log.warning(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1834 "Can't retrieve affiliation for {service}/{node}: {reason}".format(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1835 service=service, node=node, reason=e
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1836 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1837 )
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1838 affiliation = ""
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1839 else:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1840 try:
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1841 affiliation = affiliations[node]
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1842 except KeyError:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1843 affiliation = ""
1093
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1844 sat_session.setAffiliation(service, node, affiliation)
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1845 defer.returnValue(affiliation)
eda7a1c6532a server: new getAffiliation method:
Goffi <goffi@goffi.org>
parents: 1090
diff changeset
1846
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1847 ## Websocket (dynamic pages) ##
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1848
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1484
diff changeset
1849 def get_websocket_url(self, request):
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1850 base_url_split = self.getExtBaseURLData(request)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1851 if base_url_split.scheme.endswith("s"):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1852 scheme = "wss"
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1853 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1854 scheme = "ws"
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1855
1006
d0b27d1e2d50 server: moved code to retrieve external server from legacy blog to server.py, and use it to find websocket URL
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1856 return self.getExtBaseURL(request, path=scheme, scheme=scheme)
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1857
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1858
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1012
diff changeset
1859 ## Various utils ##
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1012
diff changeset
1860
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1012
diff changeset
1861 def getHTTPDate(self, timestamp=None):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1012
diff changeset
1862 now = time.gmtime(timestamp)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1863 fmt_date = "{day_name}, %d {month_name} %Y %H:%M:%S GMT".format(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1864 day_name=C.HTTP_DAYS[now.tm_wday], month_name=C.HTTP_MONTH[now.tm_mon - 1]
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1865 )
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1012
diff changeset
1866 return time.strftime(fmt_date, now)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1012
diff changeset
1867
813
6e27604ec95a server: added --tls_private_key and --tls_chain options. --tls_certificate .pem file will be used for private_key if --tls_private_key is not specified.
Goffi <goffi@goffi.org>
parents: 812
diff changeset
1868 ## service management ##
6e27604ec95a server: added --tls_private_key and --tls_chain options. --tls_certificate .pem file will be used for private_key if --tls_private_key is not specified.
Goffi <goffi@goffi.org>
parents: 812
diff changeset
1869
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1870 def _startService(self, __=None):
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
1871 """Actually start the HTTP(S) server(s) after the profile for Libervia is connected.
813
6e27604ec95a server: added --tls_private_key and --tls_chain options. --tls_certificate .pem file will be used for private_key if --tls_private_key is not specified.
Goffi <goffi@goffi.org>
parents: 812
diff changeset
1872
6e27604ec95a server: added --tls_private_key and --tls_chain options. --tls_certificate .pem file will be used for private_key if --tls_private_key is not specified.
Goffi <goffi@goffi.org>
parents: 812
diff changeset
1873 @raise ImportError: OpenSSL is not available
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
1874 @raise IOError: the certificate file doesn't exist
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
1875 @raise OpenSSL.crypto.Error: the certificate file is invalid
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
1876 """
950
67a59552f3e3 server (blog): fixed avatars handling, there is now a well-known URL to SERVICE_PROFILE cache
Goffi <goffi@goffi.org>
parents: 937
diff changeset
1877 # now that we have service profile connected, we add resource for its cache
67a59552f3e3 server (blog): fixed avatars handling, there is now a well-known URL to SERVICE_PROFILE cache
Goffi <goffi@goffi.org>
parents: 937
diff changeset
1878 service_path = regex.pathEscape(C.SERVICE_PROFILE)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1879 cache_dir = os.path.join(self.cache_root_dir, "profiles", service_path)
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1880 self.cache_resource.putChild(service_path.encode('utf-8'),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1881 ProtectedFile(cache_dir))
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1882 self.service_cache_url = "/" + os.path.join(C.CACHE_DIR, service_path)
1055
c2037b44f84e server: fixed cache_dir for service profile in session interface
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
1883 session_iface.SATSession.service_cache_url = self.service_cache_url
950
67a59552f3e3 server (blog): fixed avatars handling, there is now a well-known URL to SERVICE_PROFILE cache
Goffi <goffi@goffi.org>
parents: 937
diff changeset
1884
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1885 if self.options["connection_type"] in ("https", "both"):
1274
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1886 try:
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1887 tls.TLSOptionsCheck(self.options)
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1888 context_factory = tls.getTLSContextFactory(self.options)
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1889 except exceptions.ConfigError as e:
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1890 log.warning(
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1891 f"There is a problem in TLS settings in your configuration file: {e}")
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1892 self.quit(2)
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1893 except exceptions.DataError as e:
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1894 log.warning(
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1895 f"Can't set TLS: {e}")
eb4f03da0d7d server: re-usable Twisted TLS code has been moved to SàT backend
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1896 self.quit(1)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1897 reactor.listenSSL(self.options["port_https"], self.site, context_factory)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1898 if self.options["connection_type"] in ("http", "both"):
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1899 if (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1900 self.options["connection_type"] == "both"
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1901 and self.options["redirect_to_https"]
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1902 ):
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1903 reactor.listenTCP(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1904 self.options["port"],
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1905 server.Site(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1906 RedirectToHTTPS(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1907 self.options["port"], self.options["port_https_ext"]
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1908 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1909 ),
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1910 )
446
c406e46fe9c0 server_side: update the connection mechanism to handle profile passwords
souliane <souliane@mailoo.org>
parents: 445
diff changeset
1911 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1912 reactor.listenTCP(self.options["port"], self.site)
446
c406e46fe9c0 server_side: update the connection mechanism to handle profile passwords
souliane <souliane@mailoo.org>
parents: 445
diff changeset
1913
1108
7ec1ba86d38d server: replaced blocking calls to bridge by bridgeCall which is not blocking
Goffi <goffi@goffi.org>
parents: 1106
diff changeset
1914 @defer.inlineCallbacks
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1915 def stopService(self):
473
d1565906f228 server_side: fixed some forgotten print statement
Goffi <goffi@goffi.org>
parents: 472
diff changeset
1916 log.info(_("launching cleaning methods"))
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1917 for callback, args, kwargs in self._cleanup:
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1918 callback(*args, **kwargs)
859
0e9341e537d6 server: catch exceptions on service profile connection check, and show an helping message if an error is caught
Goffi <goffi@goffi.org>
parents: 858
diff changeset
1919 try:
1108
7ec1ba86d38d server: replaced blocking calls to bridge by bridgeCall which is not blocking
Goffi <goffi@goffi.org>
parents: 1106
diff changeset
1920 yield self.bridgeCall("disconnect", C.SERVICE_PROFILE)
859
0e9341e537d6 server: catch exceptions on service profile connection check, and show an helping message if an error is caught
Goffi <goffi@goffi.org>
parents: 858
diff changeset
1921 except Exception:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1204
diff changeset
1922 log.warning("Can't disconnect service profile")
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1923
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1924 def run(self):
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1925 reactor.run()
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1926
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1927 def stop(self):
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1928 reactor.stop()
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1929
812
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1930 def quit(self, exit_code=None):
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1931 """Exit app when reactor is running
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1932
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1933 @param exit_code(None, int): exit code
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1934 """
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1935 self.stop()
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1936 sys.exit(exit_code or 0)
fd6965c16e7e server: added "quit" method to exit with an exit code when reactor is running
Goffi <goffi@goffi.org>
parents: 810
diff changeset
1937
415
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1938
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
1939 class RedirectToHTTPS(web_resource.Resource):
415
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1940 def __init__(self, old_port, new_port):
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
1941 web_resource.Resource.__init__(self)
415
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1942 self.isLeaf = True
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1943 self.old_port = old_port
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1944 self.new_port = new_port
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1945
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1946 def render(self, request):
1354
4751e9febbbf server: fixed HTTPS redirection
Goffi <goffi@goffi.org>
parents: 1321
diff changeset
1947 netloc = request.URLPath().netloc.decode().replace(
4751e9febbbf server: fixed HTTPS redirection
Goffi <goffi@goffi.org>
parents: 1321
diff changeset
1948 f":{self.old_port}", f":{self.new_port}"
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1949 )
1354
4751e9febbbf server: fixed HTTPS redirection
Goffi <goffi@goffi.org>
parents: 1321
diff changeset
1950 url = f"https://{netloc}{request.uri.decode()}"
4751e9febbbf server: fixed HTTPS redirection
Goffi <goffi@goffi.org>
parents: 1321
diff changeset
1951 return web_util.redirectTo(url.encode(), request)
415
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1952
fadbba1d793f server_side: added support for SSL and related parameters:
souliane <souliane@mailoo.org>
parents: 413
diff changeset
1953
919
7b267496da1d server: moved session interfaces to session_iface module + added SATGuestSession
Goffi <goffi@goffi.org>
parents: 917
diff changeset
1954 registerAdapter(session_iface.SATSession, server.Session, session_iface.ISATSession)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1955 registerAdapter(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1956 session_iface.SATGuestSession, server.Session, session_iface.ISATGuestSession
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1108
diff changeset
1957 )