diff --git a/package-lock.json b/package-lock.json
index 6259932..c6f646c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,30 +16,30 @@
}
},
"node_modules/@azure/msal-browser": {
- "version": "2.27.0",
- "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.27.0.tgz",
- "integrity": "sha512-PyATq2WvK+x32waRqqikym8wvn939iO9UhpFqhLwitNrfLa3PHUgJuuI9oLSQOS3/UzjYb8aqN+XzchU3n/ZuQ==",
+ "version": "2.28.1",
+ "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.28.1.tgz",
+ "integrity": "sha512-5uAfwpNGBSRzBGTSS+5l4Zw6msPV7bEmq99n0U3n/N++iTcha+nIp1QujxTPuOLHmTNCeySdMx9qzGqWuy22zQ==",
"dev": true,
"dependencies": {
- "@azure/msal-common": "^7.1.0"
+ "@azure/msal-common": "^7.3.0"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@azure/msal-common": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.1.0.tgz",
- "integrity": "sha512-WyfqE5mY/rggjqvq0Q5DxLnA33KSb0vfsUjxa95rycFknI03L5GPYI4HTU9D+g0PL5TtsQGnV3xzAGq9BFCVJQ==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.3.0.tgz",
+ "integrity": "sha512-revxB3z+QLjwAtU1d04nC1voFr+i3LfqTpUfgrWZVqKh/sSgg0mZZUvw4vKVWB57qtL95sul06G+TfdFZny1Xw==",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@popperjs/core": {
- "version": "2.11.5",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz",
- "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==",
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
+ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -47,9 +47,9 @@
}
},
"node_modules/@types/bootstrap": {
- "version": "5.1.12",
- "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.12.tgz",
- "integrity": "sha512-pSS5BGEgepwzdbsBGswBWFmgrnYpp7c4UfuYe1FJWwkrcjm/JVwfG4gBkOYtd92Otd3RdJK0ByBWMkBROfLEPw==",
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.3.tgz",
+ "integrity": "sha512-r2SE9NYaaI7B/jJk8gqRtXzlhgFL6dlXBResJkCbQa8ept619WeiOIO4zBQxdmUFzkKNWLK5ZOyYGI3QZoaqbQ==",
"dev": true,
"dependencies": {
"@popperjs/core": "^2.9.2"
@@ -77,22 +77,28 @@
"dev": true
},
"node_modules/bootstrap": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
- "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz",
+ "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==",
"dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/bootstrap"
- },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
"peerDependencies": {
- "@popperjs/core": "^2.10.2"
+ "@popperjs/core": "^2.11.5"
}
},
"node_modules/jquery": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
- "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz",
+ "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==",
"dev": true
},
"node_modules/uuid": {
@@ -107,30 +113,30 @@
},
"dependencies": {
"@azure/msal-browser": {
- "version": "2.27.0",
- "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.27.0.tgz",
- "integrity": "sha512-PyATq2WvK+x32waRqqikym8wvn939iO9UhpFqhLwitNrfLa3PHUgJuuI9oLSQOS3/UzjYb8aqN+XzchU3n/ZuQ==",
+ "version": "2.28.1",
+ "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.28.1.tgz",
+ "integrity": "sha512-5uAfwpNGBSRzBGTSS+5l4Zw6msPV7bEmq99n0U3n/N++iTcha+nIp1QujxTPuOLHmTNCeySdMx9qzGqWuy22zQ==",
"dev": true,
"requires": {
- "@azure/msal-common": "^7.1.0"
+ "@azure/msal-common": "^7.3.0"
}
},
"@azure/msal-common": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.1.0.tgz",
- "integrity": "sha512-WyfqE5mY/rggjqvq0Q5DxLnA33KSb0vfsUjxa95rycFknI03L5GPYI4HTU9D+g0PL5TtsQGnV3xzAGq9BFCVJQ==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.3.0.tgz",
+ "integrity": "sha512-revxB3z+QLjwAtU1d04nC1voFr+i3LfqTpUfgrWZVqKh/sSgg0mZZUvw4vKVWB57qtL95sul06G+TfdFZny1Xw==",
"dev": true
},
"@popperjs/core": {
- "version": "2.11.5",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz",
- "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==",
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
+ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
"dev": true
},
"@types/bootstrap": {
- "version": "5.1.12",
- "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.12.tgz",
- "integrity": "sha512-pSS5BGEgepwzdbsBGswBWFmgrnYpp7c4UfuYe1FJWwkrcjm/JVwfG4gBkOYtd92Otd3RdJK0ByBWMkBROfLEPw==",
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.3.tgz",
+ "integrity": "sha512-r2SE9NYaaI7B/jJk8gqRtXzlhgFL6dlXBResJkCbQa8ept619WeiOIO4zBQxdmUFzkKNWLK5ZOyYGI3QZoaqbQ==",
"dev": true,
"requires": {
"@popperjs/core": "^2.9.2"
@@ -158,16 +164,16 @@
"dev": true
},
"bootstrap": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
- "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz",
+ "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==",
"dev": true,
"requires": {}
},
"jquery": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
- "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz",
+ "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==",
"dev": true
},
"uuid": {
diff --git a/src/main/resources/web/index.html b/src/main/resources/web/index.html
index 2e78473..883abab 100644
--- a/src/main/resources/web/index.html
+++ b/src/main/resources/web/index.html
@@ -26,24 +26,24 @@ frame-src 'self' https://login.microsoftonline.com/ https://login.live.com/"
-
-
+
-
@@ -110,33 +110,88 @@ frame-src 'self' https://login.microsoftonline.com/ https://login.live.com/"
- Connecting to backend server:
+ Connecting to server:
@@ -318,10 +373,10 @@ frame-src 'self' https://login.microsoftonline.com/ https://login.live.com/"
-
The instance will cache your Minecraft access token, allowing you to connect without keeping
- this page open.
-
Note that the access token expires in ~1 day and a compromised instance may access your account
- with malicious intents.
+
The instance will cache your Minecraft access token for some minutes, allowing you to connect
+ without keeping this page open.
+
Note that the access token are valid for ~1 day and a compromised instance may be used to access
+ your account.
You'll need to connect as online-mode in the front-end. It's not possible to use the cached
token when changing the backend username
diff --git a/src/main/resources/web/js/config.js b/src/main/resources/web/js/config.js
index 83815a7..df92164 100644
--- a/src/main/resources/web/js/config.js
+++ b/src/main/resources/web/js/config.js
@@ -8,4 +8,6 @@ const whitelistedOrigin = [
"https://via.re.yt.nom.br"
];
// Default CORS Proxy config
-const defaultCorsProxy = "https://cors.re.yt.nom.br/";
\ No newline at end of file
+const defaultCorsProxy = "https://cors.re.yt.nom.br/";
+// Default instance suffix, in format "viaaas.example.com[:25565]", null to use the page hostname;
+const defaultInstanceSuffix = null;
\ No newline at end of file
diff --git a/src/main/resources/web/js/page.js b/src/main/resources/web/js/page.js
index 209d3da..b45f970 100644
--- a/src/main/resources/web/js/page.js
+++ b/src/main/resources/web/js/page.js
@@ -20,6 +20,7 @@ let listening = document.getElementById("listening");
let accounts = document.getElementById("accounts-list");
let cors_proxy_txt = document.getElementById("cors-proxy");
let ws_url_txt = document.getElementById("ws-url");
+let instance_suffix_input = document.getElementById("instance_suffix");
let listenVisible = false;
let deltaTime = 0;
let workers = [];
@@ -39,8 +40,12 @@ $(() => {
$(".async-css").attr("rel", "stylesheet");
$("form").on("submit", e => e.preventDefault());
$("a[href='javascript:']").on("click", e => e.preventDefault());
+ $("[data-bs-toggle='tooltip']").get().forEach(it => {
+ new bootstrap.Tooltip(it);
+ });
cors_proxy_txt.value = getCorsProxy();
ws_url_txt.value = getWsUrl();
+ instance_suffix_input.defaultValue = getDefaultInstanceSuffix();
$("#form_add_ms").on("submit", () => loginMs());
$("#form_ws_url").on("submit", () => setWsUrl($("#ws-url").val()));
$("#form_cors_proxy").on("submit", () => setCorsProxy($("#cors-proxy").val()));
@@ -48,8 +53,11 @@ $(() => {
$("#form_send_token").on("submit", () => submittedSendToken());
$("#en_notifications").on("click", () => Notification.requestPermission().then(renderActions));
$("#listen_continue").on("click", () => clickedListenContinue());
- window.addEventListener('beforeinstallprompt', e => e.preventDefault());
+ $("#address_info_form").on("input", () => generateAddress());
+ $("#generated_address").on("click", () => copyGeneratedAddress());
+ $(window).on("beforeinstallprompt", e => e.preventDefault());
ohNo();
+ generateAddress();
refreshAccountList();
setInterval(refreshCorsStatus, 10 * 60 * 1000);
refreshCorsStatus();
@@ -104,6 +112,39 @@ function refreshAccountList() {
addUsernameList(it.name);
});
}
+function copyGeneratedAddress() {
+ navigator.clipboard.writeText($("#generated_address").text()).catch(e => console.log(e));
+}
+function generateAddress() {
+ let backAddress = $("#connect_address").val();
+ try {
+ let url = new URL("https://" + backAddress);
+ let finalAddress = "";
+ let host = url.hostname;
+ let version = $("#connect_version").val().toString().replaceAll(".", "_");
+ let username = $("#connect_user").val();
+ let onlineMode = $("#connect_online").val().toString();
+ if (host.includes(":") || host.includes("[")) {
+ host = host.replaceAll(":", "-")
+ .replaceAll(/[\[\]]/g, "") + ".sslip.io";
+ }
+ finalAddress += host;
+ if (url.port)
+ finalAddress += "._p" + url.port;
+ if (version)
+ finalAddress += "._v" + version;
+ if (username)
+ finalAddress += "._u" + username;
+ if (onlineMode)
+ finalAddress += "._o" + onlineMode.substring(0, 1);
+ finalAddress += "." + $("#instance_suffix").val();
+ $("#generated_address").text(finalAddress);
+ }
+ catch (e) {
+ console.log(e);
+ $("#generated_address").text("");
+ }
+}
$("#mcIdUsername").text(mcIdUsername);
function submittedListen() {
let user = $("#listen_username").val();
@@ -314,6 +355,9 @@ function authNotification(msg, yes, no) {
function defaultCors() {
return self.defaultCorsProxy || "https://cors.re.yt.nom.br/";
}
+function getDefaultInstanceSuffix() {
+ return self.defaultInstanceSuffix || location.hostname;
+}
function getCorsProxy() {
return localStorage.getItem("viaaas_cors_proxy") || defaultCors();
}
diff --git a/src/main/resources/web/js/page.ts b/src/main/resources/web/js/page.ts
index 1dcf172..308a531 100644
--- a/src/main/resources/web/js/page.ts
+++ b/src/main/resources/web/js/page.ts
@@ -1,5 +1,6 @@
///
"use strict"
+// Note that some APIs only work on HTTPS
// Minecraft.id
let urlParams = new URLSearchParams();
@@ -26,6 +27,7 @@ let listening = document.getElementById("listening");
let accounts = document.getElementById("accounts-list");
let cors_proxy_txt = document.getElementById("cors-proxy") as HTMLInputElement;
let ws_url_txt = document.getElementById("ws-url") as HTMLInputElement;
+let instance_suffix_input = document.getElementById("instance_suffix") as HTMLInputElement;
let listenVisible = false;
// + deltaTime means that the clock is ahead
let deltaTime = 0;
@@ -47,9 +49,13 @@ $(() => {
$(".async-css").attr("rel", "stylesheet");
$("form").on("submit", e => e.preventDefault());
$("a[href='javascript:']").on("click", e => e.preventDefault());
+ $("[data-bs-toggle='tooltip']").get().forEach(it => {
+ new bootstrap.Tooltip(it);
+ });
cors_proxy_txt.value = getCorsProxy();
ws_url_txt.value = getWsUrl();
+ instance_suffix_input.defaultValue = getDefaultInstanceSuffix();
$("#form_add_ms").on("submit", () => loginMs());
$("#form_ws_url").on("submit", () => setWsUrl($("#ws-url").val() as string));
@@ -58,10 +64,13 @@ $(() => {
$("#form_send_token").on("submit", () => submittedSendToken());
$("#en_notifications").on("click", () => Notification.requestPermission().then(renderActions));
$("#listen_continue").on("click", () => clickedListenContinue());
- window.addEventListener('beforeinstallprompt', e => e.preventDefault());
+ $("#address_info_form").on("input", () => generateAddress());
+ $("#generated_address").on("click", () => copyGeneratedAddress());
+ $(window).on("beforeinstallprompt", e => e.preventDefault());
ohNo();
+ generateAddress();
refreshAccountList();
setInterval(refreshCorsStatus, 10 * 60 * 1000);
refreshCorsStatus();
@@ -125,6 +134,36 @@ function refreshAccountList() {
});
}
+function copyGeneratedAddress() {
+ navigator.clipboard.writeText($("#generated_address").text()).catch(e => console.log(e));
+}
+
+function generateAddress() {
+ let backAddress = $("#connect_address").val();
+ try {
+ let url = new URL("https://" + backAddress);
+ let finalAddress = "";
+ let host = url.hostname;
+ let version = $("#connect_version").val().toString().replaceAll(".", "_");
+ let username = $("#connect_user").val();
+ let onlineMode = $("#connect_online").val().toString();
+ if (host.includes(":") || host.includes("[")) {
+ host = host.replaceAll(":", "-")
+ .replaceAll(/[\[\]]/g, "") + ".sslip.io";
+ }
+ finalAddress += host;
+ if (url.port) finalAddress += "._p" + url.port;
+ if (version) finalAddress += "._v" + version;
+ if (username) finalAddress += "._u" + username;
+ if (onlineMode) finalAddress += "._o" + onlineMode.substring(0, 1);
+ finalAddress += "." + $("#instance_suffix").val();
+ $("#generated_address").text(finalAddress)
+ } catch (e) {
+ console.log(e);
+ $("#generated_address").text("");
+ }
+}
+
$("#mcIdUsername").text(mcIdUsername);
function submittedListen() {
@@ -354,6 +393,11 @@ function defaultCors(): string {
return self.defaultCorsProxy || "https://cors.re.yt.nom.br/";
}
+function getDefaultInstanceSuffix(): string {
+ // @ts-ignore
+ return self.defaultInstanceSuffix || location.hostname;
+}
+
function getCorsProxy(): string {
return localStorage.getItem("viaaas_cors_proxy") || defaultCors();
}
diff --git a/src/main/resources/web/tsconfig.json b/src/main/resources/web/tsconfig.json
index d866106..d6e7f9a 100644
--- a/src/main/resources/web/tsconfig.json
+++ b/src/main/resources/web/tsconfig.json
@@ -3,7 +3,7 @@
"target": "ES2018",
"module": "ES2015",
"lib": [
- "ES2018",
+ "ES2021",
"DOM"
],
"moduleResolution": "Node",