From db96e9dcef03828c20400799bed4799769d9b7f1 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 4 Mar 2022 14:35:55 -0500 Subject: [PATCH] client: add otl token requester --- .../java/net/runelite/client/RuneLite.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 5c4497385f..c970428798 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -27,9 +27,12 @@ package net.runelite.client; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Strings; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; +import com.jagex.oldscape.pub.OAuthApi; +import com.jagex.oldscape.pub.OtlTokenResponse; import java.applet.Applet; import java.io.File; import java.io.IOException; @@ -45,6 +48,7 @@ import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.Locale; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; import javax.annotation.Nullable; @@ -81,6 +85,8 @@ import net.runelite.client.ui.overlay.tooltip.TooltipOverlay; import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay; import net.runelite.http.api.RuneLiteAPI; import okhttp3.Cache; +import okhttp3.Call; +import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -105,6 +111,9 @@ public class RuneLite @Getter private static Injector injector; + @Inject + private OkHttpClient okHttpClient; + @Inject private PluginManager pluginManager; @@ -314,6 +323,11 @@ public class RuneLite } applet.start(); + + if (applet instanceof OAuthApi) + { + setupJxAuth((OAuthApi) applet); + } } SplashScreen.stage(.57, null, "Loading configuration"); @@ -536,4 +550,83 @@ public class RuneLite System.setProperty(key, value); } } + + private void setupJxAuth(OAuthApi oAuthApi) + { + String accessToken = System.getenv("JX_ACCESS_TOKEN"); + if (Strings.isNullOrEmpty(accessToken)) + { + return; + } + + try + { + log.info("Initializing OTL token requester with access token"); + oAuthApi.setOtlTokenRequester(url -> + { + CompletableFuture f = new CompletableFuture<>(); + okHttpClient.newCall(new Request.Builder() + .url(url) + .header("Authorization", "Bearer " + accessToken) + .get() + .build()) + .enqueue(new Callback() + { + private void complete(boolean success, String token) + { + f.complete(new OtlTokenResponse() + { + @Override + public boolean isSuccess() + { + return success; + } + + @Override + public String getToken() + { + return token; + } + }); + } + + @Override + public void onFailure(Call call, IOException e) + { + log.error("HTTP error while performing OTL request", e); + complete(false, null); + } + + @Override + public void onResponse(Call call, Response response) throws IOException + { + if (response.code() != 200) + { + log.error("Non-OK response performing OTL request: {}", response.code()); + complete(false, null); + response.close(); + return; + } + + if (response.body() == null) + { + log.error("OK response with empty body from OTL request"); + complete(false, null); + response.close(); + return; + } + + log.debug("Successful OTL response"); + complete(true, response.body().string()); + response.close(); + } + }); + return f; + }); + } + catch (LinkageError ex) + { + log.error("error setting up OTL requester", ex); + } + } }