VIAaaS/src/main/resources/web/index.html

400 lines
21 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<title>VIAaaS</title>
<meta content="VIAaaS" name="application-name">
<meta content="VIAaaS" property="og:site_name">
<meta content="VIAaaS - ViaVersion as a Service - Standalone ViaVersion Proxy" name="description">
<meta content="VIAaaS" property="og:title">
<meta content="VIAaaS - ViaVersion as a Service - Standalone ViaVersion Proxy" property="og:description">
<meta content="game" property="og:type">
<meta content="img/logo.webp" property="og:image">
<link href="img/logo.webp" rel="icon">
<link rel="manifest" href="manifest.json">
<meta content="default-src 'self';
style-src 'self' https://cdnjs.cloudflare.com/;
img-src 'self' data: https://crafthead.net/ https://crafatar.com/;
connect-src 'self' http://localhost:*/ https: wss:;
script-src 'self' https://*.cloudflare.com/ https://alcdn.msauth.net/ https://*.cloudflareinsights.com/;
frame-src 'self' https://login.microsoftonline.com/ https://login.live.com/"
http-equiv="Content-Security-Policy">
<meta content="no-referrer" name="referrer">
<meta content="noindex" name="robots">
<meta content="#0468a1" name="theme-color">
<!-- https://www.srihash.org/ -->
<link class="async-css" rel="preload" as="style"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.0/css/bootstrap.min.css"
integrity="sha512-XWTTruHZEYJsxV3W/lSXG1n3Q39YIWOstqvmFsdNEEQfHoZ6vm6E9GK2OrF6DSJSpIbRbi+Nn0WDPID9O7xB2Q=="
crossorigin="anonymous" referrerpolicy="no-referrer"/>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.0/js/bootstrap.bundle.min.js"
integrity="sha512-9GacT4119eY3AcosfWtHMsT5JyZudrexyEVzTBWV3viP/YfB9e2pEy3N7WXL3SV6ASXpTU0vzzSxsbfsuUH4sQ=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- Safari workaround -->
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/HTML5Notification/3.0.0/Notification.min.js"
integrity="sha512-gx0m7Qoum1Bb0KrP6AEZSt0e+o2xMEyStAz2TNGXGqR4HSVgPveWFQdtE06FRvJmmp8HdkJklOLYiV3aZN6tQg=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js"
integrity="sha512-aVKKRRi/Q/YV+4mjoKBsE4x3H+BkegoM/em46NNlCqNTmUYADjBbeNefNxYV7giUp0VxICtqdrbqU7iVaeZNXA=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script defer crossorigin="anonymous"
integrity="sha512-UNM1njAgOFUa74Z0bADwAq8gbTcqZC8Ej4xPSzpnh0l6KMevwvkBvbldF9uR++qKeJ+MOZHRjV1HZjoRvjDfNQ=="
src="https://cdnjs.cloudflare.com/ajax/libs/uuid/8.3.2/uuid.min.js"></script>
<script defer src="https://alcdn.msauth.net/browser/2.28.1/js/msal-browser.min.js"
integrity="sha384-ei8xVSyFPTuRnbO1sdYy5qJT6Kd9neBfVG8AjZySEwdMG1GhCThbceSqxJnx0Ci3"
crossorigin="anonymous"></script>
<script defer src="js/config.js"></script>
<script defer src="js/page.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark mb-2">
<div class="container">
<a class="navbar-brand" href="javascript:">VIAaaS</a>
<button aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"
class="navbar-toggler"
data-bs-target="#navbarSupportedContent" data-bs-toggle="collapse" type="button">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav nav" role="tablist">
<li class="nav-item" role="presentation">
<a aria-controls="home" aria-selected="true" class="nav-link active" data-bs-toggle="tab"
href="#home"
id="home-tab" role="tab">Status</a>
</li>
<li class="nav-item" role="presentation">
<a aria-controls="accounts" aria-selected="false" class="nav-link" data-bs-toggle="tab"
href="#accounts"
id="accounts-tab" role="tab">Accounts</a>
</li>
<li class="nav-item" role="presentation">
<a aria-controls="settings" aria-selected="false" class="nav-link" data-bs-toggle="tab"
href="#settings"
id="settings-tab" role="tab">Settings</a>
</li>
<li class="nav-item dropdown">
<a aria-expanded="false" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#"
id="aboutDropdown" role="button">About</a>
<ul aria-labelledby="aboutDropdown" class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item" data-bs-toggle="modal" href="#aboutModal" role="tab">About
VIAaaS</a></li>
<li><a class="dropdown-item" data-bs-toggle="modal" href="#privacyModal" role="tab">Privacy</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div class="container tab-content" id="content">
<div aria-labelledby="home-tab" class="tab-pane fade show active" id="home">
<p>WebSocket connection status: <span class="text-white bg-dark" id="connection_status">?</span></p>
<hr>
<div class="mb-3">
<p>Listening to front-end logins from:</p>
<ul class="list-group" id="listening"></ul>
</div>
<div id="actions">
<button type="button" class="btn btn-primary" id="listen_continue">Listen to <span
id="mcIdUsername"></span>
</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal"
data-bs-target="#listenModal"
id="listen_open">Listen to logins
</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal"
data-bs-target="#sendTokenModal"
id="send_token_open">Send Access Token
</button>
</div>
<hr>
<p>Connecting to server:</p>
<div id="connect">
<form class="input-group mb-3 row g-3 justify-content-md-center" id="address_info_form">
<div class="col-md-3">
<input id="connect_address" type="text" class="form-control" placeholder="Address:Port"
aria-label="Address and Port">
</div>
<div class="col-md-2">
<div class="input-group">
<span class="input-group-text"><abbr title="Version">v</abbr></span>
<input id="connect_version" type="text" class="form-control col-auto" placeholder="Version"
aria-label="Version" list="backend_version_list">
</div>
<datalist id="backend_version_list">
<option>AUTO</option>
<option value="1.19.2">1.19.1/2</option>
<option>1.19</option>
<option>1.18.2</option>
<option value="1.18.1">1.18(.1)</option>
<option>1.17.1</option>
<option>1.17</option>
<option value="1.16.5">1.16.4/5</option>
<option>1.16.3</option>
<option>1.16.2</option>
<option>1.16.1</option>
<option>1.16</option>
<option>1.15.2</option>
<option>1.15.1</option>
<option>1.15</option>
<option>1.14.4</option>
<option>1.14.3</option>
<option>1.14.2</option>
<option>1.14.1</option>
<option>1.14</option>
<option>1.13.2</option>
<option>1.13.1</option>
<option>1.13</option>
<option>1.12.2</option>
<option>1.12.1</option>
<option>1.12</option>
<option value="1.11.2">1.11.1/2</option>
<option>1.11</option>
<option value="1.10">1.10.x</option>
<option value="1.9.4">1.9.3/4</option>
<option>1.9.2</option>
<option>1.9.1</option>
<option>1.9</option>
<option>1.8.x</option>
<option value="1.7.10">1.7.6-10</option>
<option value="1.7.5">1.7.2-5</option>
</datalist>
</div>
<div class="col-md-2">
<div class="input-group">
<span class="input-group-text"><abbr title="Username">u</abbr></span>
<input id="connect_user" type="text" class="form-control" placeholder="Back Username"
aria-label="Backend Username" list="backend_user_list" maxlength="16">
</div>
<datalist id="backend_user_list"></datalist>
</div>
<div class="col-md-2">
<div class="input-group">
<span class="input-group-text"><abbr title="Online Mode">o</abbr></span>
<select class="form-select" id="connect_online" aria-label="Online Mode">
<option value="" selected>Front Auth...</option>
<option>AUTO</option>
<option value="true">Online</option>
<option value="false">Offline (recommended for Geyser)</option>
</select>
</div>
</div>
<div class="col-md-2">
<div class="input-group">
<span class="input-group-text">.</span>
<input id="instance_suffix" type="text" class="form-control"
placeholder="Instance Suffix" aria-label="Instance Suffix" readonly>
</div>
</div>
</form>
<p>You can also use this address to specify the server:
<span class="font-monospace" id="generated_address" data-bs-toggle="tooltip" data-bs-placement="top"
title="Click to copy"></span></p>
</div>
</div>
<div aria-labelledby="settings-tab" class="tab-pane fade" id="settings">
<div class="mb-3">
<button id="en_notifications" type="button" class="btn btn-primary">Enable browser notifications</button>
</div>
<div class="mb-3">
<button class="btn btn-secondary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAdvConf"
aria-expanded="false" aria-controls="collapseAdvConfig">Advanced
</button>
</div>
<div class="collapse" id="collapseAdvConf">
<div class="mb-3">
<p>CORS Proxy status: <span class="text-white bg-dark" id="cors_status">?</span></p>
<form class="input-group" id="form_cors_proxy">
<label class="input-group-text" for="cors-proxy">CORS Proxy</label>
<input class="form-control" id="cors-proxy" placeholder="http://localhost:8080/" type="url">
<button class="btn btn-primary" type="submit">Save</button>
</form>
</div>
<div class="mb-3">
<form class="input-group" id="form_ws_url">
<label class="input-group-text" for="ws-url">WebSocket</label>
<input class="form-control" id="ws-url" placeholder="wss://viaaas.example.com/ws" type="url">
<button class="btn btn-primary" type="submit">Save</button>
</form>
</div>
</div>
</div>
<div aria-labelledby="accounts-tab" class="tab-pane fade" id="accounts">
<div class="mb-3">
<p class="form-label">Accounts stored in the browser</p>
<ul class="list-group" id="accounts-list"></ul>
</div>
<div id="add-account">
<div class="mb-3">
<label class="form-label" for="form_add_ms">Add Microsoft account</label>
<form class="row justify-content-md-center" id="form_add_ms">
<div class="col-md-auto">
<button class="btn btn-primary" id="login_submit_ms" type="submit">Login with Microsoft</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div aria-hidden="true" aria-labelledby="aboutModalLabel" class="modal fade" id="aboutModal" tabindex="-1">
<div class="modal-dialog modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="aboutModalLabel">About</h5>
<button aria-label="Close" class="btn-close" data-bs-dismiss="modal" type="button"></button>
</div>
<div class="modal-body">
<!-- Design somewhat stolen/inspired from Gnome -->
<img loading="lazy" src="img/logo.webp"
class="mx-auto d-block" alt="VIAaaS logo" width="150">
<div class="text-center mb-3">
<h5>ViaVersion as a Service</h5>
<h6>Standalone ViaVersion Proxy</h6>
</div>
<div class="text-center mb-3">
<p class="mb-1">Copyright © 2020-2022 <a
href="https://github.com/creeper123123321">creeper123123321</a></p>
<p class="mb-1">Copyright © 2021-2022 <a
href="https://github.com/ViaVersion/VIAaaS/graphs/contributors">contributors</a>
</p>
</div>
<div>
<p>VIAaaS is free software: you can redistribute it and/or modify it under the terms of the GNU
Affero General Public License as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.</p>
<p>VIAaaS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Affero General Public License for more details.</p>
<p>You should have received a copy of the GNU Affero General Public License along with this program.
If not, see <a href="https://gnu.org/licenses">https://gnu.org/licenses/</a>.</p>
</div>
</div>
<div class="modal-footer">
<a class="btn btn-secondary" href="https://github.com/ViaVersion/VIAaaS/" role="button">Source Code</a>
<button class="btn btn-primary" data-bs-dismiss="modal" type="button">Close</button>
</div>
</div>
</div>
</div>
<div aria-hidden="true" aria-labelledby="privacyModalLabel" class="modal fade" id="privacyModal" tabindex="-1">
<div class="modal-dialog modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="privacyModalLabel">Privacy</h5>
<button aria-label="Close" class="btn-close" data-bs-dismiss="modal" type="button"></button>
</div>
<div class="modal-body">
<div>
<p>Data collected by instance:</p>
<ul>
<li>access date and time</li>
<li>backend Minecraft server IP</li>
<li>client IP address, port, protocol version, approximate geolocation,
ASN and reverse DNS lookup
</li>
<li>disconnection reason</li>
<li>HTTP query string</li>
<li>Minecraft usernames</li>
</ul>
<p>Why are these data collected?</p>
<ul>
<li>analytics</li>
<li>improving our services</li>
<li>troubleshooting</li>
</ul>
<p>When are data collected?</p>
<ul>
<li>accessing web service</li>
<li>connecting to Minecraft proxy service</li>
</ul>
<p>Third parties</p>
<ul>
<li><a href="https://cloudflare.com">Cloudflare</a>: CDN and libraries</li>
<li><a href="https://github.com/creeper123123321/cors-anywhere/">creeper123123321's CORS
Anywhere</a>: proxy for Mojang API
</li>
<li><a href="https://ipinfo.io">IPInfo.io</a>: provides info about IP address</li>
<li><a href="https://microsoft.com">Microsoft</a>: login service</li>
<li><a href="https://mojang.com">Mojang</a>: login service</li>
<li><a href="https://minecraft.id">MinecraftID</a>: authenticates usernames</li>
<li><a href="https://major.io/icanhazip-com-faq/">icanhazip.com</a>: returns IP address and Unix
time
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div aria-hidden="true" aria-labelledby="listenModalLabel" class="modal fade" id="listenModal" tabindex="-1">
<div class="modal-dialog modal-dialog-scrollable">
<form id="form_listen">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="listenModalLabel">Listen to logins</h5>
<button aria-label="Close" class="btn-close" data-bs-dismiss="modal" type="button"></button>
</div>
<div class="modal-body">
<p>The instance will send impersonation requests to this page. Please note
that they're verified by UUID, so offline and online accounts
are considered different.</p>
<p>VIAaaS will also request the address parameters when they're not specified.
They're verified by username. Online-mode listeners have priority.</p>
<div class="mb-3">
<label for="listen_username" class="form-label">Username</label>
<input type="text" class="form-control" id="listen_username">
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="listen_online" checked>
<label for="listen_online" class="form-check-label">Online Mode</label>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary" data-bs-dismiss="modal">Listen</button>
</div>
</div>
</form>
</div>
</div>
<div aria-hidden="true" aria-labelledby="listenModalLabel" class="modal fade" id="sendTokenModal" tabindex="-1">
<div class="modal-dialog modal-dialog-scrollable">
<form id="form_send_token">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="sendTokenModalLabel">Save Access Token in Instance</h5>
<button aria-label="Close" class="btn-close" data-bs-dismiss="modal" type="button"></button>
</div>
<div class="modal-body">
<p>The instance will cache your Minecraft access token for some minutes, allowing you to connect
without keeping this page open.</p>
<p>Note that the access token are valid for ~1 day and a compromised instance may be used to access
your account.</p>
<p>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</p>
<div class="input-group mb-3">
<label class="input-group-text" for="send_token_user">Account</label>
<select class="form-select" id="send_token_user">
<option selected>Choose...</option>
</select>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary" data-bs-dismiss="modal">Send</button>
</div>
</div>
</form>
</div>
</div>
<div class="toast-container position-absolute top-0 end-0 p-3" id="toasts"></div>
</body>
</html>