diff --git a/maubot/management/frontend/src/api.js b/maubot/management/frontend/src/api.js index dc4bbc0..61fcbd8 100644 --- a/maubot/management/frontend/src/api.js +++ b/maubot/management/frontend/src/api.js @@ -14,7 +14,11 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -export const BASE_PATH = "/_matrix/maubot/v1" +var BASE_PATH = "/_matrix/maubot/v1" + +export function setBasePath(basePath) { + BASE_PATH = basePath +} function getHeaders(contentType = "application/json") { return { @@ -241,8 +245,7 @@ export async function doClientAuth(server, type, username, password) { } export default { - BASE_PATH, - login, ping, getFeatures, remoteGetFeatures, + login, ping, setBasePath, getFeatures, remoteGetFeatures, openLogSocket, debugOpenFile, debugOpenFileEnabled, updateDebugOpenFileEnabled, getInstances, getInstance, putInstance, deleteInstance, diff --git a/maubot/management/frontend/src/pages/Main.js b/maubot/management/frontend/src/pages/Main.js index 33660d9..3434fe1 100644 --- a/maubot/management/frontend/src/pages/Main.js +++ b/maubot/management/frontend/src/pages/Main.js @@ -31,6 +31,7 @@ class Main extends Component { } async componentWillMount() { + await this.getBasePath() if (localStorage.accessToken) { await this.ping() } else { @@ -39,6 +40,21 @@ class Main extends Component { this.setState({ pinged: true }) } + async getBasePath() { + try { + const resp = await fetch("./paths.json", { + headers: { "Content-Type": "application/json" } + }) + const apiPathJson = await resp.json() + const apiPath = apiPathJson.api_path + console.log(apiPath) + api.setBasePath(`${apiPath}`) + } catch (err) { + console.error(err) + } + } + + async ping() { try { const username = await api.ping() diff --git a/maubot/server.py b/maubot/server.py index fa84e9d..e06307e 100644 --- a/maubot/server.py +++ b/maubot/server.py @@ -16,6 +16,8 @@ from typing import Tuple, Dict import logging import asyncio +import json +from urllib.parse import urlparse from aiohttp import web, hdrs from aiohttp.abc import AbstractAccessLogger @@ -63,7 +65,8 @@ async def handle_plugin_path(self, request: web.Request) -> web.Response: def get_instance_subapp(self, instance_id: str) -> Tuple[PluginWebApp, str]: subpath = self.config["server.plugin_base_path"] + instance_id - url = self.config["server.public_url"] + subpath + path_prefix = self.config["server.public_url_path_prefix"].rstrip("/") + url = self.config["server.public_url"] + path_prefix + subpath try: return self.plugin_routes[subpath], url except KeyError: @@ -129,6 +132,22 @@ def setup_static_root_files(self, directory: str, ui_base: str) -> None: self.app.router.add_get(f"{ui_base}/{file}", lambda _: web.Response(body=data, content_type=mime)) + # also set up a resource path for the public url path prefix config + # cut the prefix path from public_url + public_url = self.config["server.public_url"] + base_path = self.config["server.base_path"] + public_url_path = "" + if public_url != "": + url_parts = urlparse(public_url) + public_url_path = url_parts.path.rstrip("/") + + # assemble with base_path + api_path = f"{public_url_path}{base_path}" + + path_prefix_response_body = json.dumps({"api_path": api_path.rstrip("/")}) + self.app.router.add_get(f"{ui_base}/paths.json", lambda _: web.Response(body=path_prefix_response_body, + content_type="application/json")) + def add_route(self, method: Method, path: PathBuilder, handler) -> None: self.app.router.add_route(method.value, str(path), handler)