2021-10-15 16:56:22 +02:00
|
|
|
import { logger } from "matrix-js-sdk/src/logger";
|
|
|
|
|
2021-12-09 23:57:46 +01:00
|
|
|
import { getVectorConfig } from '../getconfig';
|
|
|
|
|
2021-07-06 21:33:01 +02:00
|
|
|
function onBackToElementClick(): void {
|
2019-04-04 02:01:09 +02:00
|
|
|
// Cookie should expire in 4 hours
|
2020-07-13 18:32:17 +02:00
|
|
|
document.cookie = 'element_mobile_redirect_to_guide=false;path=/;max-age=14400';
|
2018-09-03 21:38:30 +02:00
|
|
|
window.location.href = '../';
|
|
|
|
}
|
|
|
|
|
2019-05-15 00:59:02 +02:00
|
|
|
// NEVER pass user-controlled content to this function! Hardcoded strings only please.
|
2021-07-06 21:33:01 +02:00
|
|
|
function renderConfigError(message: string): void {
|
2019-05-15 00:59:02 +02:00
|
|
|
const contactMsg = "If this is unexpected, please contact your system administrator " +
|
|
|
|
"or technical support representative.";
|
2020-07-13 18:32:17 +02:00
|
|
|
message = `<h2>Error loading Element</h2><p>${message}</p><p>${contactMsg}</p>`;
|
2019-05-15 00:59:02 +02:00
|
|
|
|
|
|
|
const toHide = document.getElementsByClassName("mx_HomePage_container");
|
2021-07-06 21:33:01 +02:00
|
|
|
const errorContainers = document.getElementsByClassName(
|
|
|
|
"mx_HomePage_errorContainer",
|
|
|
|
) as HTMLCollectionOf<HTMLDialogElement>;
|
2019-05-15 00:59:02 +02:00
|
|
|
|
|
|
|
for (const e of toHide) {
|
|
|
|
// We have to clear the content because .style.display='none'; doesn't work
|
|
|
|
// due to an !important in the CSS.
|
|
|
|
e.innerHTML = '';
|
|
|
|
}
|
|
|
|
for (const e of errorContainers) {
|
|
|
|
e.style.display = 'block';
|
|
|
|
e.innerHTML = message;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-06 21:33:01 +02:00
|
|
|
async function initPage(): Promise<void> {
|
2020-07-13 18:32:17 +02:00
|
|
|
document.getElementById('back_to_element_button').onclick = onBackToElementClick;
|
2018-09-03 21:38:30 +02:00
|
|
|
|
2020-07-21 12:30:28 +02:00
|
|
|
const config = await getVectorConfig('..');
|
2019-05-15 00:59:02 +02:00
|
|
|
|
|
|
|
// We manually parse the config similar to how validateServerConfig works because
|
|
|
|
// calling that function pulls in roughly 4mb of JS we don't use.
|
|
|
|
|
|
|
|
const wkConfig = config['default_server_config']; // overwritten later under some conditions
|
|
|
|
const serverName = config['default_server_name'];
|
|
|
|
const defaultHsUrl = config['default_hs_url'];
|
|
|
|
const defaultIsUrl = config['default_is_url'];
|
|
|
|
|
|
|
|
const incompatibleOptions = [wkConfig, serverName, defaultHsUrl].filter(i => !!i);
|
|
|
|
if (incompatibleOptions.length > 1) {
|
|
|
|
return renderConfigError(
|
|
|
|
"Invalid configuration: can only specify one of default_server_config, default_server_name, " +
|
|
|
|
"or default_hs_url.",
|
|
|
|
);
|
2018-09-03 21:38:30 +02:00
|
|
|
}
|
2019-05-15 00:59:02 +02:00
|
|
|
if (incompatibleOptions.length < 1) {
|
|
|
|
return renderConfigError("Invalid configuration: no default server specified.");
|
|
|
|
}
|
|
|
|
|
|
|
|
let hsUrl = '';
|
|
|
|
let isUrl = '';
|
|
|
|
|
|
|
|
if (wkConfig && wkConfig['m.homeserver']) {
|
|
|
|
hsUrl = wkConfig['m.homeserver']['base_url'];
|
|
|
|
|
|
|
|
if (wkConfig['m.identity_server']) {
|
|
|
|
isUrl = wkConfig['m.identity_server']['base_url'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (serverName) {
|
2019-05-15 01:57:04 +02:00
|
|
|
// We also do our own minimal .well-known validation to avoid pulling in the js-sdk
|
|
|
|
try {
|
|
|
|
const result = await fetch(`https://${serverName}/.well-known/matrix/client`);
|
|
|
|
const wkConfig = await result.json();
|
|
|
|
if (wkConfig && wkConfig['m.homeserver']) {
|
|
|
|
hsUrl = wkConfig['m.homeserver']['base_url'];
|
|
|
|
|
|
|
|
if (wkConfig['m.identity_server']) {
|
|
|
|
isUrl = wkConfig['m.identity_server']['base_url'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (e) {
|
2021-10-15 16:56:22 +02:00
|
|
|
logger.error(e);
|
2019-05-15 01:57:04 +02:00
|
|
|
return renderConfigError("Unable to fetch homeserver configuration");
|
|
|
|
}
|
2019-05-15 00:59:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (defaultHsUrl) {
|
|
|
|
hsUrl = defaultHsUrl;
|
|
|
|
isUrl = defaultIsUrl;
|
|
|
|
}
|
|
|
|
|
2019-05-15 01:57:04 +02:00
|
|
|
if (!hsUrl) {
|
|
|
|
return renderConfigError("Unable to locate homeserver");
|
|
|
|
}
|
|
|
|
|
2018-09-27 19:19:33 +02:00
|
|
|
if (hsUrl && !hsUrl.endsWith('/')) hsUrl += '/';
|
2019-05-15 00:59:02 +02:00
|
|
|
if (isUrl && !isUrl.endsWith('/')) isUrl += '/';
|
|
|
|
|
2019-05-15 01:57:04 +02:00
|
|
|
if (hsUrl !== 'https://matrix.org/') {
|
2021-07-06 21:33:01 +02:00
|
|
|
(document.getElementById('configure_element_button') as HTMLAnchorElement).href =
|
2020-07-28 17:38:50 +02:00
|
|
|
"https://mobile.element.io?hs_url=" + encodeURIComponent(hsUrl) +
|
2019-09-10 19:27:57 +02:00
|
|
|
"&is_url=" + encodeURIComponent(isUrl);
|
2019-09-12 01:08:24 +02:00
|
|
|
document.getElementById('step1_heading').innerHTML= '1: Install the app';
|
2018-09-04 11:08:52 +02:00
|
|
|
document.getElementById('step2_container').style.display = 'block';
|
2019-05-15 00:59:02 +02:00
|
|
|
document.getElementById('hs_url').innerText = hsUrl;
|
|
|
|
|
2019-11-28 02:26:18 +01:00
|
|
|
if (isUrl) {
|
2019-05-15 00:59:02 +02:00
|
|
|
document.getElementById('custom_is').style.display = 'block';
|
|
|
|
document.getElementById('is_url').style.display = 'block';
|
|
|
|
document.getElementById('is_url').innerText = isUrl;
|
|
|
|
}
|
2018-09-04 11:08:52 +02:00
|
|
|
}
|
2018-09-03 21:38:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
initPage();
|