1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-05-07 21:17:46 +00:00
kawari/resources/templates/launcher.html
Joshua Goins def9b4ab48 Add Bootstrap styling for the launcher page, implement launcher login
Instead of the placeholder SID, it sets it to an actual one that can be
used with the lobby server.
2025-05-03 18:16:36 -04:00

190 lines
8.5 KiB
HTML

{% extends "layout.html" %}
{% block title %}Kawari Launcher{% endblock %}
{% block body %}
<p>Welcome to Kawari!</p>
<form id="login">
<label for="sqexid" class="form-label">Username</label><br>
<input type='text' id='sqexid' name='sqexid' class="form-control"/><br>
<label for="password" class="form-label">Password</label><br>
<input id='password' name='password' class="form-control" type="password"/><br>
<label for="otppw" class="form-label">One-Time Password</label><br>
<input type='text' id='otppw' name='otppw' class="form-control"/><br>
<input type="hidden" id="_STORED_" name="_STORED_" value="34657" />
<button type='submit' class="btn btn-primary">Login</button>
</form>
<input type="button" value="System Info" onclick="window.external.user('systemInfo');" />
<input type="button" value="Play" onclick="window.external.user('startPlay');" />
<input type="button" value="Login" onclick="window.external.user('login=auth,ok,sid,9001,terms,1,region,2,etmadd,0,playable,1,ps3pkg,0,maxex,5,product,1');" />
<input type="button" value="Login Error" onclick="window.external.user('login=auth,ng,err,Test error.');" />
<input type="button" value="Exit" onclick="window.external.user('requestExit');" />
<input type="button" value="Reboot" onclick="window.external.user('requestReboot');" />
<input type="button" value="Open Google" onclick="window.external.user('link=https://google.com/');" />
<input type="button" value="Accept EULA" onclick="window.external.user('eulaOk');" />
<input type="button" value="Accept Ex EULA" onclick="window.external.user('eulaExOk');" />
<input type="button" value="Disable DX11" onclick="window.external.user('config=dx11enabled=0');" />
<input type="button" value="Enable DX11" onclick="window.external.user('config=dx11enabled=1');" />
<input type="button" value="Request Config" onclick="window.external.user('requestConfig');" />
<input type="button" value="Request Login Url" onclick="window.external.user('requestLoginUrl');" />
<input type="button" value="Request Platform" onclick="window.external.user('requestDP');" />
<input type="button" value="Config Tool" onclick="window.external.user('configTransport');" />
<p id="replace-me">meh</p>
<script type="text/javascript">
let req;
function readystatechange(event) {
if (req.readyState == 4) {
// This login endpoint sends a "window.external.user" which we need to evaludate.
eval(req.response);
}
}
function error(event) {
document.getElementById('replace-me').innerText += "login error: " + event;
}
function login() {
let sqexid = document.getElementById('sqexid').value;
let password = document.getElementById('password').value;
let otppw = document.getElementById('otppw').value;
let stored = document.getElementById('_STORED_').value;
req = new XMLHttpRequest();
req.addEventListener("readystatechange", readystatechange);
req.addEventListener("error", error);
req.open("POST", "http://ffxiv-login.square.localhost/oauth/ffxivarr/login/login.send");
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send("sqexid=" + sqexid + "&password=" + password + "&otppw=" + otppw + "&_STORED_=" + stored);
}
function checkHandlerType(e) {
if ('function' != typeof e) throw new Error('Protocol Callback is not function.');
return e
}
function fromAppConfig(thing) {
document.getElementById('replace-me').innerText += "config: " + JSON.stringify(thing);
}
window.fromAppConfig = this.checkHandlerType(fromAppConfig);
function fromAppWarn(thing) {
document.getElementById('replace-me').innerText += "warn: " + JSON.stringify(thing);
}
window.fromAppWarn = this.checkHandlerType(fromAppWarn);
function fromAppStartVersionCheck(thing) {
document.getElementById('replace-me').innerText += "version: " + JSON.stringify(thing);
// the official launcher does some preparation stuff here, and when it's finished it tells it the ID it just recieved
window.external.user('received=' + thing.ID);
}
window.fromAppStartVersionCheck = this.checkHandlerType(fromAppStartVersionCheck);
function fromAppDP(thing) {
document.getElementById('replace-me').innerText += "dp: " + JSON.stringify(thing);
}
window.fromAppDP = this.checkHandlerType(fromAppDP);
function fromAppDisplaySettings(thing) {
document.getElementById('replace-me').innerText += "display settings: " + JSON.stringify(thing);
}
window.fromAppDisplaySettings = this.checkHandlerType(fromAppDisplaySettings);
function fromAppResumeInfo(thing) {
document.getElementById('replace-me').innerText += "resume info: " + JSON.stringify(thing);
// acknowledge
window.external.user('received=' + thing.ID);
}
window.fromAppResumeInfo = this.checkHandlerType(fromAppResumeInfo);
function fromAppLoginUrl(thing) {
document.getElementById('replace-me').innerText += "login info: " + JSON.stringify(thing);
}
window.fromAppLoginUrl = this.checkHandlerType(fromAppLoginUrl);
function fromAppExAgree(thing) {
document.getElementById('replace-me').innerText += "ex agree: " + JSON.stringify(thing);
}
window.fromAppExAgree = this.checkHandlerType(fromAppExAgree);
function fromAppStartDownload(thing) {
document.getElementById('replace-me').innerText += "start download: " + JSON.stringify(thing);
}
window.fromAppStartDownload = this.checkHandlerType(fromAppStartDownload);
function fromAppDownloadProgress(thing) {
document.getElementById('replace-me').innerText += "download prog: " + JSON.stringify(thing);
}
window.fromAppDownloadProgress = this.checkHandlerType(fromAppDownloadProgress);
function fromAppInstallProgress(thing) {
document.getElementById('replace-me').innerText += "install prog: " + JSON.stringify(thing);
}
window.fromAppInstallProgress = this.checkHandlerType(fromAppInstallProgress);
function fromAppStartInstall(thing) {
document.getElementById('replace-me').innerText += "start install: " + JSON.stringify(thing);
}
window.fromAppStartInstall = this.checkHandlerType(fromAppStartInstall);
function fromAppWaitPlay(thing) {
document.getElementById('replace-me').innerText += "wait play: " + JSON.stringify(thing);
// the official launcher does some preparation stuff here, and when it's finished it tells it the ID it just recieved
window.external.user('received=' + thing.ID);
// it requests the config again?
window.external.user('requestConfig');
}
window.fromAppWaitPlay = this.checkHandlerType(fromAppWaitPlay);
function fromAppStartFileCheck(thing) {
document.getElementById('replace-me').innerText += "file check: " + JSON.stringify(thing);
}
window.fromAppStartFileCheck = this.checkHandlerType(fromAppStartFileCheck);
function fromAppFileCheckProgress(thing) {
document.getElementById('replace-me').innerText += "file check prog: " + JSON.stringify(thing);
}
window.fromAppFileCheckProgress = this.checkHandlerType(fromAppFileCheckProgress);
function fromAppFinishedFileCheck(thing) {
document.getElementById('replace-me').innerText += "file check finished: " + JSON.stringify(thing);
}
window.fromAppFinishedFileCheck = this.checkHandlerType(fromAppFinishedFileCheck);
function fromAppServiceAgreement(thing) {
document.getElementById('replace-me').innerText += "agreement: " + JSON.stringify(thing);
}
window.fromAppServiceAgreement = this.checkHandlerType(fromAppServiceAgreement);
function fromAppDialog(thing) {
document.getElementById('replace-me').innerText += "dialog: " + JSON.stringify(thing);
}
window.fromAppDialog = this.checkHandlerType(fromAppDialog);
// this is what the retail launcher does
window.external.user('permissionFromApp=1');
window.external.user('requestDP');
window.external.user('requestConfig');
window.external.user('requestDisplaySettings');
window.external.user('requestResumeInfo');
// setup form submission
const form = document.getElementById("login");
form.addEventListener("submit", function (event) {
// ie11 is amazing
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
login();
});
</script>
{% endblock %}