Added gateway-specific Q-Apps handler. For now, just show a warning alert if an app requires authentication / interactive features.

This commit is contained in:
CalDescent 2023-03-19 10:41:37 +00:00
parent 2848ae695c
commit 2a7a2d3220
3 changed files with 72 additions and 0 deletions

View File

@ -7,6 +7,8 @@ import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.qortal.arbitrary.misc.Service;
import java.util.Objects;
public class HTMLParser {
private static final Logger LOGGER = LogManager.getLogger(HTMLParser.class);
@ -43,6 +45,12 @@ public class HTMLParser {
String qAppsScriptElement = String.format("<script src=\"/apps/q-apps.js?time=%d\">", System.currentTimeMillis());
head.get(0).prepend(qAppsScriptElement);
// Add q-apps gateway script tag if in gateway mode
if (Objects.equals(this.qdnContext, "gateway")) {
String qAppsGatewayScriptElement = String.format("<script src=\"/apps/q-apps-gateway.js?time=%d\">", System.currentTimeMillis());
head.get(0).prepend(qAppsGatewayScriptElement);
}
// Escape and add vars
String service = this.service.toString().replace("\"","\\\"");
String name = this.resourceId != null ? this.resourceId.replace("\"","\\\"") : "";

View File

@ -54,4 +54,30 @@ public class AppsResource {
}
}
@GET
@Path("/q-apps-gateway.js")
@Hidden // For internal Q-App API use only
@Operation(
summary = "Gateway-specific interface for Q-Apps",
responses = {
@ApiResponse(
description = "javascript",
content = @Content(
mediaType = MediaType.TEXT_PLAIN,
schema = @Schema(
type = "string"
)
)
)
}
)
public String getQAppsGatewayJs() {
URL url = Resources.getResource("q-apps/q-apps-gateway.js");
try {
return Resources.toString(url, StandardCharsets.UTF_8);
} catch (IOException e) {
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FILE_NOT_FOUND);
}
}
}

View File

@ -0,0 +1,38 @@
console.log("Gateway mode");
window.addEventListener("message", (event) => {
if (event == null || event.data == null || event.data.length == 0) {
return;
}
if (event.data.action == null || event.data.requestedHandler == null) {
return;
}
if (event.data.requestedHandler != "UI") {
// Gateway mode only cares about requests that were intended for the UI
return;
}
let response;
let data = event.data;
switch (data.action) {
case "GET_USER_ACCOUNT":
case "PUBLISH_QDN_RESOURCE":
case "SEND_CHAT_MESSAGE":
case "JOIN_GROUP":
case "DEPLOY_AT":
case "GET_WALLET_BALANCE":
case "SEND_COIN":
const errorString = "Authentication was requested, but this is not yet supported when viewing via a gateway. To use interactive features, please access using the Qortal UI desktop app. More info at: https://qortal.org";
alert(errorString);
response = "{\"error\": \"" + errorString + "\"}"
break;
default:
console.log('Unhandled gateway message: ' + JSON.stringify(data));
return;
}
handleResponse(event, response);
}, false);