Skip to content

Commit 1cfa570

Browse files
committed
OAuthFlow Alpha
1 parent 7a4073f commit 1cfa570

File tree

5 files changed

+278
-5
lines changed

5 files changed

+278
-5
lines changed

src/main/java/jdaSrc/JavaDestinyAPIMain.java

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,38 +8,85 @@
88

99
package jdaSrc;
1010

11+
import com.google.gson.JsonObject;
12+
import com.google.gson.JsonParser;
13+
import com.google.gson.stream.JsonReader;
14+
import material.DestinyAPI;
1115
import utils.framework.OAuthManager;
1216

17+
import java.io.*;
18+
import java.nio.file.Paths;
19+
1320
public class JavaDestinyAPIMain extends OAuthManager {
1421

22+
// Paths.get("").toAbsolutePath().toString()).getPath() + "\\oauth.json"
23+
24+
private File file = new File(Paths.get("").toAbsolutePath() + "\\oauth.json");
25+
private JsonObject jsonObject;
26+
27+
public JavaDestinyAPIMain() {
28+
try {
29+
if (!file.exists()) {
30+
file.createNewFile();
31+
}
32+
33+
try {
34+
jsonObject = new JsonParser().parse(new FileReader(file.getAbsolutePath())).getAsJsonObject();
35+
} catch (IllegalStateException exception) { // If the file is empty or corrupted
36+
jsonObject = new JsonObject();
37+
}
38+
} catch (IOException e) {
39+
e.printStackTrace();
40+
}
41+
}
1542

1643
@Override
1744
public String getAccessToken() {
45+
if(jsonObject.has("access-token")) {
46+
return jsonObject.get("access-token").getAsString();
47+
}
48+
1849
return null;
1950
}
2051

2152
@Override
2253
public String getRefreshToken() {
54+
if(jsonObject.has("refresh-token")) {
55+
return jsonObject.get("refresh-token").getAsString();
56+
}
57+
2358
return null;
2459
}
2560

2661
@Override
2762
public String getAPIToken() {
28-
return null;
63+
return DestinyAPI.getApiKey();
2964
}
3065

3166
@Override
3267
public void setAccessToken(String accessToken) {
33-
68+
jsonObject.addProperty("access-token", accessToken);
69+
save();
3470
}
3571

3672
@Override
3773
public void setRefreshToken(String refreshToken) {
38-
74+
jsonObject.addProperty("refresh-token", refreshToken);
75+
save();
3976
}
4077

4178
@Override
4279
public void setAPIToken(String apiToken) {
4380

4481
}
82+
83+
public void save() {
84+
try (FileWriter fileWriter = new FileWriter(file.getAbsolutePath())) {
85+
fileWriter.write(jsonObject.toString());
86+
fileWriter.flush();
87+
} catch (IOException e) {
88+
e.printStackTrace();
89+
}
90+
}
4591
}
92+

src/main/java/material/DestinyAPI.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,19 @@ public static Clan getClan(String name) {
273273
public static String getOauthCode() { return oauthCode; }
274274

275275
public static String getAccessToken() {
276-
return oam.getAccessToken();
276+
if(DestinyAPI.hasOauthManager()) {
277+
return oam.getAccessToken();
278+
}
279+
280+
return accessToken;
277281
}
278282

279283
public static String getRefreshToken() {
280-
return oam.getRefreshToken();
284+
if(DestinyAPI.hasOauthManager()) {
285+
return oam.getRefreshToken();
286+
}
287+
288+
return refreshToken;
281289
}
282290

283291
public static boolean isDebugEnabled() { return DestinyAPI.debugEnabled; }

src/main/java/utils/HttpUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ public String setTokenViaRefresh() {
120120
return at;
121121
}
122122

123+
/**
124+
* Requries an OAuthCode to be manually set inside of the DestinyAPI.setOAuthCode()
125+
*/
123126
public void setTokenViaAuth() {
124127
setTokenViaAuth(DestinyAPI.getOauthCode());
125128
}

src/main/java/utils/StringUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
package utils;
1010

11+
import java.io.IOException;
1112
import java.text.DateFormat;
1213
import java.text.DecimalFormat;
1314
import java.text.ParseException;
@@ -54,4 +55,12 @@ public static double getDaysSinceTime(Date date) {
5455
public static String httpEncode(String input) {
5556
return input.replace(" ", "%20").replace("#", "%23").replace("^", "%5E");
5657
}
58+
59+
public static void executeCommandLine(String command) {
60+
try {
61+
Process process = Runtime.getRuntime().exec(command);
62+
} catch (IOException e) {
63+
e.printStackTrace();
64+
}
65+
}
5766
}
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
/*
2+
* Copyright (c) dec4234 2021. Access is granted, without any express warranties or guarantees of
3+
* any kind, to all wishing to use this software for their benefit. No one may specifically claim credit, or
4+
* ownership of this software without the explicit permission of the author.
5+
*
6+
* GitHub -> https://github.com/dec4234/JavaDestinyAPI
7+
*/
8+
9+
package utils.framework;
10+
11+
import com.sun.net.httpserver.*;
12+
import material.DestinyAPI;
13+
14+
import javax.net.ssl.KeyManagerFactory;
15+
import javax.net.ssl.SSLContext;
16+
import javax.net.ssl.SSLParameters;
17+
import javax.net.ssl.TrustManagerFactory;
18+
import java.awt.Desktop;
19+
import java.io.*;
20+
import java.net.*;
21+
import java.nio.charset.StandardCharsets;
22+
import java.nio.file.Paths;
23+
import java.security.KeyStore;
24+
import java.util.ArrayList;
25+
import java.util.List;
26+
import java.util.concurrent.Executors;
27+
28+
public class OAuthFlow {
29+
30+
private String queryParameters = "empty";
31+
private volatile boolean hasQueryBeenReturned = false;
32+
33+
public void initOAuthFlow(int port) {
34+
setTokens(port);
35+
}
36+
37+
public void initOAuthFlowIfNeeded(int port) {
38+
if(!DestinyAPI.hasOauthManager() || DestinyAPI.getAccessToken() == null) {
39+
initOAuthFlow(8080);
40+
}
41+
}
42+
43+
public void setTokens(int serverPort) {
44+
openOAuthPage();
45+
46+
startSecureServer(serverPort);
47+
48+
String rawCode = getRawCode(queryParameters);
49+
50+
System.out.println(rawCode);
51+
52+
DestinyAPI.getHttpUtils().setTokenViaAuth(rawCode);
53+
}
54+
55+
public String getRawCode(String queryInput) {
56+
String codeString = queryInput.split("&")[0];
57+
58+
return codeString.split("=")[1];
59+
}
60+
61+
public void openOAuthPage() {
62+
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
63+
try {
64+
Desktop.getDesktop().browse(new URI("https://www.bungie.net/en/OAuth/Authorize?client_id=" + DestinyAPI.getClientId() + "&response_type=code"));
65+
} catch (IOException | URISyntaxException e) {
66+
e.printStackTrace();
67+
}
68+
}
69+
}
70+
71+
public void startSecureServer(int port) {
72+
HttpsServer server = null;
73+
final String[] queryParams = {""};
74+
75+
SSLContext sslContext = null;
76+
try {
77+
server = HttpsServer.create(new InetSocketAddress(port), 0);
78+
sslContext = SSLContext.getInstance("TLS");
79+
char[] password = "mypassword".toCharArray();
80+
KeyStore ks = KeyStore.getInstance("JKS");
81+
FileInputStream fis = new FileInputStream(new File(Paths.get("").toAbsolutePath().toString()).getPath() + "\\keystore.jks");
82+
ks.load(fis, password);
83+
84+
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
85+
kmf.init(ks, password);
86+
87+
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
88+
tmf.init(ks);
89+
90+
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
91+
92+
} catch (Exception e) {
93+
e.printStackTrace();
94+
System.exit(-1);
95+
}
96+
97+
HttpsConfigurator httpsConfigurator = new HttpsConfigurator(sslContext) {
98+
@Override
99+
public void configure(HttpsParameters httpsParameters) {
100+
SSLContext sslContext = getSSLContext();
101+
SSLParameters defaultSSLParameters = sslContext.getDefaultSSLParameters();
102+
httpsParameters.setSSLParameters(defaultSSLParameters);
103+
}
104+
};
105+
106+
server.createContext("/", t -> {
107+
HttpsExchange s = (HttpsExchange) t;
108+
s.getSSLSession();
109+
110+
String response = "<html><body>You can now close this page.</body></html>";
111+
t.sendResponseHeaders(200, response.length());
112+
OutputStream os = t.getResponseBody();
113+
os.write(response.getBytes());
114+
115+
getQueryParameters(s);
116+
117+
os.close();
118+
119+
s.close();
120+
});
121+
122+
long time = System.currentTimeMillis() + (30 * 1000);
123+
124+
server.setExecutor(Executors.newCachedThreadPool());
125+
server.setHttpsConfigurator(httpsConfigurator);
126+
server.start();
127+
128+
// A crude attempt at a time-out
129+
while(!hasQueryBeenReturned && time > System.currentTimeMillis()) {
130+
131+
}
132+
133+
server.stop(0);
134+
}
135+
136+
public String getQueryParameters(HttpsExchange exchange) {
137+
queryParameters = exchange.getRequestURI().getQuery();
138+
hasQueryBeenReturned = true;
139+
140+
return queryParameters;
141+
}
142+
143+
@Deprecated
144+
public String startHttpServer(int port) {
145+
String response = null;
146+
147+
try (ServerSocket serverSocket = new ServerSocket(8080)) {
148+
boolean hasConnected = false;
149+
150+
while (true) {
151+
Socket socket = serverSocket.accept();
152+
153+
try {
154+
try (InputStream inputStream = socket.getInputStream()) { // ARM
155+
if (!hasConnected) {
156+
readInputHeaders(inputStream).forEach(s -> {
157+
System.out.println(s);
158+
});
159+
160+
// String requestHeader = getHeaderToArray(raw).split("\n")[0].replace("GET ", "").replace(" HTTP/1.1", "");
161+
162+
// System.out.println(requestHeader);
163+
164+
String httpResponse = "HTTP/1.1 200 OK\r\n\r\n You can now close this window.";
165+
socket.getOutputStream().write(httpResponse.getBytes(StandardCharsets.UTF_8));
166+
167+
hasConnected = true;
168+
}
169+
}
170+
} catch (MalformedURLException ex) {
171+
System.err.println(socket.getLocalAddress() + " is not a parseable URL");
172+
} catch (IOException ex) {
173+
System.err.println(ex.getMessage());
174+
}
175+
}
176+
177+
} catch (Exception ex) {
178+
System.out.println(ex.getMessage());
179+
}
180+
181+
return response;
182+
}
183+
184+
private List<String> readInputHeaders(InputStream inputStream) {
185+
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
186+
187+
List<String> headers = new ArrayList<>();
188+
189+
while (true) {
190+
String s = null;
191+
try {
192+
s = br.readLine();
193+
} catch (IOException e) {
194+
e.printStackTrace();
195+
}
196+
197+
if (s == null || s.trim().length() == 0) {
198+
break;
199+
}
200+
201+
headers.add(s);
202+
}
203+
204+
return headers;
205+
}
206+
}

0 commit comments

Comments
 (0)