Skip to content

Commit 534a2e4

Browse files
improve auth message
closes #221
1 parent 011fae3 commit 534a2e4

5 files changed

Lines changed: 72 additions & 21 deletions

File tree

src/main/kotlin/com/viaversion/aas/Util.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ fun generateOfflinePlayerUuid(username: String): UUID {
155155
return UUID.nameUUIDFromBytes("OfflinePlayer:$username".encodeToByteArray())
156156
}
157157

158+
fun isOfflinePlayer(uuid: UUID): Boolean {
159+
return uuid.version() == 3
160+
}
161+
158162
fun checkLocalAddress(inetAddress: InetAddress): Boolean {
159163
return VIAaaSConfig.blockLocalAddress && (inetAddress.isAnyLocalAddress
160164
|| inetAddress.isLinkLocalAddress

src/main/kotlin/com/viaversion/aas/web/WebLogin.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,17 @@ class WebLogin : WebState {
171171
if (uuid != expectedId) {
172172
throw IllegalStateException("expected $expectedId == $uuid")
173173
}
174+
val username = profile["name"].asString
174175

175176
webClient.server.addAccessToken(uuid, accessToken)
176177
webLogger.info("Received token: {} {}", webClient.id, uuid)
178+
179+
val response = JsonObject().also {
180+
it.addProperty("action", "save_access_token_result")
181+
it.addProperty("username", username)
182+
it.addProperty("uuid", uuid.toString())
183+
it.addProperty("success", true)
184+
}
185+
webClient.ws.sendSerialized(response)
177186
}
178187
}

src/main/kotlin/com/viaversion/aas/web/WebServer.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import io.ktor.client.request.*
1616
import io.ktor.http.*
1717
import io.ktor.server.netty.*
1818
import io.ktor.server.websocket.*
19+
import io.ktor.util.network.address
1920
import io.ktor.websocket.*
2021
import io.netty.handler.codec.dns.DefaultDnsQuestion
2122
import io.netty.handler.codec.dns.DnsPtrRecord
@@ -120,7 +121,8 @@ class WebServer {
120121
suspend fun renewToken(token: String): String? {
121122
val info = parseToken(token) ?: return null
122123
var name = info.name ?: "(unknown)"
123-
if (info.id.version() == 4) { // random
124+
if (!isOfflinePlayer(info.id)) {
125+
// update username
124126
name = idToProfileCache[info.id].await()?.get("name")?.asString ?: name
125127
}
126128
return generateToken(info.id, name)
@@ -220,34 +222,33 @@ class WebServer {
220222
} else {
221223
coroutineScope.apply {
222224
launch(Dispatchers.IO) {
223-
var info: JsonObject? = null
224225
var ptr: String? = null
225226
if (address is InetSocketAddress) {
226227
try {
227-
val cleanedIp = address.hostString.substringBefore("%")
228228
val dnsQuery = AspirinServer.dnsResolver
229229
.resolveAll(DefaultDnsQuestion(reverseLookup(address.address), DnsRecordType.PTR))
230-
ptr = dnsQuery.suspendAwait().let {
230+
ptr = dnsQuery.suspendAwait().let { dnsResult ->
231231
try {
232-
it.firstNotNullOfOrNull { it as? DnsPtrRecord }?.hostname()
232+
dnsResult.firstNotNullOfOrNull { it as? DnsPtrRecord }?.hostname()
233233
?.removeSuffix(".")
234234
} finally {
235-
it.forEach { ReferenceCountUtil.release(it) }
235+
dnsResult.forEach { ReferenceCountUtil.release(it) }
236236
}
237237
}
238238
} catch (ignored: Exception) {
239239
}
240240
}
241241

242-
val reverseInfo = if (ptr != null) "($ptr)" else ""
243-
244-
val msg = "Requester: $id $address $reverseInfo\nBackend: $backAddress"
245242
listeners[id].forEach {
246243
it.ws.sendSerialized(JsonObject().also {
247244
it.addProperty("action", "session_hash_request")
248245
it.addProperty("user", name)
246+
it.addProperty("requester_id", id.toString())
247+
it.addProperty("requester_name", frontName)
248+
it.addProperty("requester_address", address.address)
249+
it.addProperty("requester_reverse_dns", ptr)
250+
it.addProperty("backend_server", backAddress.address)
249251
it.addProperty("session_hash", hash)
250-
it.addProperty("message", msg)
251252
})
252253
it.ws.flush()
253254
}

src/main/resources/web/js/page.js

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,15 @@ function addToast(title, msg, yes = null, no = null) {
223223
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
224224
</div>
225225
<div class="toast-body">
226-
<pre class="txt text-wrap"></pre>
226+
<div class="txt text-wrap"></div>
227227
<div class="btns mt-2 pt-2 border-top"></div>
228228
</div>
229229
</div>`);
230230
toast.find(".toast_title_msg").text(title);
231231
let tBody = toast.find(".toast-body");
232-
tBody.find(".txt").text(msg);
232+
let txtElement = tBody.find(".txt");
233+
txtElement.text(msg);
234+
txtElement.html(txtElement.html().replaceAll("\n", "<br>"));
233235
let btns = $(tBody).find(".btns");
234236
let hasButtons = false;
235237
if (yes != null) {
@@ -631,10 +633,23 @@ function unlisten(id) {
631633
function confirmJoin(hash) {
632634
socket?.send(JSON.stringify({ action: "session_hash_response", session_hash: hash }));
633635
}
636+
function isOfflinePlayer(uuid) {
637+
const version = uuid.replaceAll('-', '').charAt(12);
638+
return version === '3';
639+
}
634640
function handleJoinRequest(parsed) {
635-
authNotification("Allow auth from VIAaaS instance?\nAccount: "
636-
+ parsed.user + "\nServer Message: \n"
637-
+ parsed.message.split(/[\r\n]+/).map((it) => "> " + it).join('\n'), () => {
641+
let backName = parsed.user;
642+
let frontId = parsed.requester_id;
643+
let frontOnline = !isOfflinePlayer(frontId);
644+
let frontName = parsed.requester_name;
645+
let offline = frontOnline ? "" : "* (off)";
646+
let backServer = parsed.backend_server;
647+
let address = parsed.requester_address;
648+
let reverse = parsed.requester_reverse_dns;
649+
let msg = `Allow '${frontName}'${offline} to use account '${backName}'?`
650+
+ `\nDestination: ${backServer}`
651+
+ `\nIP address of requester: ${address} (${reverse})`;
652+
authNotification(msg, () => {
638653
let account = findAccountByMcName(parsed.user);
639654
if (account) {
640655
account.joinGame(parsed.session_hash)
@@ -678,6 +693,9 @@ function onWsMsg(event) {
678693
case "parameters_request":
679694
handleParametersRequest(parsed);
680695
break;
696+
case "save_access_token_result":
697+
addToast("Saved access token", "Received access token of account " + parsed.username + ".");
698+
break;
681699
}
682700
}
683701
function handleParametersRequest(parsed) {

src/main/typescript/web/js/page.ts

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,14 +240,16 @@ function addToast(title: string, msg: string, yes: (() => void) | null = null, n
240240
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
241241
</div>
242242
<div class="toast-body">
243-
<pre class="txt text-wrap"></pre>
243+
<div class="txt text-wrap"></div>
244244
<div class="btns mt-2 pt-2 border-top"></div>
245245
</div>
246246
</div>`);
247247
toast.find(".toast_title_msg").text(title);
248248

249-
let tBody = toast.find(".toast-body");
250-
tBody.find(".txt").text(msg);
249+
let tBody = toast.find(".toast-body")
250+
let txtElement = tBody.find(".txt")
251+
txtElement.text(msg);
252+
txtElement.html(txtElement.html().replaceAll("\n", "<br>"));
251253

252254
let btns = $(tBody).find(".btns");
253255
let hasButtons = false;
@@ -705,10 +707,24 @@ function confirmJoin(hash: string) {
705707
socket?.send(JSON.stringify({action: "session_hash_response", session_hash: hash}));
706708
}
707709

710+
function isOfflinePlayer(uuid: string) {
711+
const version = uuid.replaceAll('-', '').charAt(12)
712+
return version === '3'
713+
}
714+
708715
function handleJoinRequest(parsed: any) {
709-
authNotification("Allow auth from VIAaaS instance?\nAccount: "
710-
+ parsed.user + "\nServer Message: \n"
711-
+ parsed.message.split(/[\r\n]+/).map((it: string) => "> " + it).join('\n'), () => {
716+
let backName = parsed.user;
717+
let frontId = parsed.requester_id
718+
let frontOnline = !isOfflinePlayer(frontId)
719+
let frontName = parsed.requester_name
720+
let offline = frontOnline ? "" : "* (off)"
721+
let backServer = parsed.backend_server
722+
let address = parsed.requester_address
723+
let reverse = parsed.requester_reverse_dns
724+
let msg = `Allow '${frontName}'${offline} to use account '${backName}'?`
725+
+ `\nDestination: ${backServer}`
726+
+ `\nIP address of requester: ${address} (${reverse})`
727+
authNotification(msg, () => {
712728
let account = findAccountByMcName(parsed.user);
713729
if (account) {
714730
account.joinGame(parsed.session_hash)
@@ -750,6 +766,9 @@ function onWsMsg(event: MessageEvent) {
750766
case "parameters_request":
751767
handleParametersRequest(parsed);
752768
break;
769+
case "save_access_token_result":
770+
addToast("Saved access token", "Received access token of account " + parsed.username + ".");
771+
break
753772
}
754773
}
755774

0 commit comments

Comments
 (0)