Added custom proxy support

This commit is contained in:
luca0N! 2021-03-28 22:53:07 -03:00
parent 7ed43c5491
commit c4faa2e831
Signed by: luca0N
GPG Key ID: 2E7B4655CF16D7D6
6 changed files with 168 additions and 7 deletions

View File

@ -320,7 +320,7 @@ public class TriviaGameActivity extends BaseActivity
String json; String json;
try { try {
json = ApiUtil.GET(query[0]); json = ApiUtil.GET(query[0]);
} catch (IOException e) { } catch (Exception e) {
return null; return null;
} }
return json; return json;

View File

@ -0,0 +1,40 @@
/*
Pluck: an open source trivia game for Android
Copyright (C) 2021 Joguitos do luca0N!
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see <https://www.gnu.org/licenses/>.
This game is a fork of LibreTrivia, and its source code is available at
<https://github.com/tryton-vanmeer/LibreTrivia>.
Contact us at <joguitos+pluck@luca0n.com>.
*/
package com.luca0n.joguitos.pluck.exceptions;
import java.lang.Throwable;
import com.luca0n.joguitos.pluck.exceptions.ProxyException;
public class MalformedProxyAddressException extends ProxyException {
public MalformedProxyAddressException(){
super();
}
public MalformedProxyAddressException(String message){
super(message);
}
public MalformedProxyAddressException(Throwable cause){
super(cause);
}
}

View File

@ -0,0 +1,38 @@
/*
Pluck: an open source trivia game for Android
Copyright (C) 2021 Joguitos do luca0N!
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see <https://www.gnu.org/licenses/>.
This game is a fork of LibreTrivia, and its source code is available at
<https://github.com/tryton-vanmeer/LibreTrivia>.
Contact us at <joguitos+pluck@luca0n.com>.
*/
package com.luca0n.joguitos.pluck.exceptions;
import java.lang.Throwable;
public class ProxyException extends Exception {
public ProxyException(){
super();
}
public ProxyException(String message){
super(message);
}
public ProxyException(Throwable cause){
super(cause);
}
}

View File

@ -0,0 +1,40 @@
/*
Pluck: an open source trivia game for Android
Copyright (C) 2021 Joguitos do luca0N!
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see <https://www.gnu.org/licenses/>.
This game is a fork of LibreTrivia, and its source code is available at
<https://github.com/tryton-vanmeer/LibreTrivia>.
Contact us at <joguitos+pluck@luca0n.com>.
*/
package com.luca0n.joguitos.pluck.exceptions;
import java.lang.Throwable;
import com.luca0n.joguitos.pluck.exceptions.ProxyException;
public class UnknownProxyProtocolException extends ProxyException {
public UnknownProxyProtocolException(){
super();
}
public UnknownProxyProtocolException(String message){
super(message);
}
public UnknownProxyProtocolException(Throwable cause){
super(cause);
}
}

View File

@ -44,11 +44,15 @@ import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.lang.IndexOutOfBoundsException;
import com.luca0n.joguitos.pluck.R; import com.luca0n.joguitos.pluck.R;
import com.luca0n.joguitos.pluck.PluckApplication; import com.luca0n.joguitos.pluck.PluckApplication;
import com.luca0n.joguitos.pluck.exceptions.NoTriviaResultsException; import com.luca0n.joguitos.pluck.exceptions.NoTriviaResultsException;
import com.luca0n.joguitos.pluck.exceptions.InvalidTriviaFormatException; import com.luca0n.joguitos.pluck.exceptions.InvalidTriviaFormatException;
import com.luca0n.joguitos.pluck.exceptions.ProxyException;
import com.luca0n.joguitos.pluck.exceptions.UnknownProxyProtocolException;
import com.luca0n.joguitos.pluck.exceptions.MalformedProxyAddressException;
import com.luca0n.joguitos.pluck.trivia.TriviaQuery; import com.luca0n.joguitos.pluck.trivia.TriviaQuery;
import com.luca0n.joguitos.pluck.trivia.TriviaQuestion; import com.luca0n.joguitos.pluck.trivia.TriviaQuestion;
import com.luca0n.joguitos.pluck.trivia.TriviaCategory; import com.luca0n.joguitos.pluck.trivia.TriviaCategory;
@ -72,7 +76,7 @@ public class ApiUtil {
return builder.toString(); return builder.toString();
} }
private static String GET(String query) throws IOException { private static String GET(String query) throws IOException, ProxyException {
String response; String response;
URL url = new URL(query); URL url = new URL(query);
@ -81,17 +85,56 @@ public class ApiUtil {
// Check if the player wants to play the game using Tor. // Check if the player wants to play the game using Tor.
Context c = PluckApplication.getAppContext(); Context c = PluckApplication.getAppContext();
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(c); SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(c);
String key = c.getResources().getString(R.string.pref_network_tor); String keyTor = c.getResources().getString(R.string.pref_network_tor);
// Connect without Tor by default. // Connect without Tor by default.
boolean useTor = sp.getBoolean(key, false); boolean useTor = sp.getBoolean(keyTor, false);
// Default Orbot SOCKS5 address. // Default Orbot SOCKS5 address.
String orbotSocks5Hostname = "127.0.0.1"; String orbotSocks5Hostname = "127.0.0.1";
int orbotSocks5Port = 9050; int orbotSocks5Port = 9050;
// Check if the player wants to play the game using a custom proxy.
String keyProxy = c.getResources().getString(R.string.pref_network_proxy);
boolean useProxy = sp.getBoolean(keyProxy, false);
// Get the player custom proxy address.
String keyProxyAddress = c.getResources().getString(R.string.pref_network_proxy_address);
String proxyAddress = sp.getString(keyProxyAddress, null);
if (useTor) if (useTor)
connection = (HttpURLConnection) url.openConnection( connection = (HttpURLConnection) url.openConnection(
new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(orbotSocks5Hostname, orbotSocks5Port))); new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(orbotSocks5Hostname, orbotSocks5Port)));
else if (useProxy){
// The provided custom proxy should be in the following format:
// <protocol>://<hostname>:<port>.
// Make sure the player specified the proxy address.
if (proxyAddress == null)
throw new MalformedProxyAddressException("A proxy address was expected, but was not specified.");
// We need to parse the proxy address in order to get the proxy protocol.
Proxy.Type protocol = null;
if (proxyAddress.startsWith("http:"))
protocol = Proxy.Type.HTTP;
else if (proxyAddress.startsWith("socks:")
|| proxyAddress.startsWith("socks5:"))
protocol = Proxy.Type.SOCKS;
else else
// Unknown proxy type.
throw new UnknownProxyProtocolException("The client was unable to get the proxy type based on the specified proxy address. It should start with the proxy protocol, like \"http://\" or \"socks5\".");
// We'll need to get the hostname and the port.
String proxyHostname;
int proxyPort;
try {
proxyHostname = proxyAddress.split(":")[1].substring(2); // use substring() in order to ignore the "//".
proxyPort = Integer.parseInt(proxyAddress.split(":")[2]);
} catch (IndexOutOfBoundsException e){
// Throw a new MalformedProxyAddressException exception if the app can't recognize the proxy address.
throw new MalformedProxyAddressException();
}
connection = (HttpURLConnection) url.openConnection(
new Proxy(protocol, new InetSocketAddress(proxyHostname, proxyPort)));
}else
connection = (HttpURLConnection) url.openConnection(); connection = (HttpURLConnection) url.openConnection();
try { try {
@ -105,7 +148,7 @@ public class ApiUtil {
} }
public static String GET(TriviaQuery query) public static String GET(TriviaQuery query)
throws IOException { throws IOException, ProxyException {
return GET(query.toString()); return GET(query.toString());
} }

View File

@ -95,7 +95,7 @@ Contact us at <joguitos+pluck@luca0n.com>.
<!-- Error Strings --> <!-- Error Strings -->
<string name="error">Error</string> <string name="error">Error</string>
<string name="error_network"><b>Network error!</b>\n\nCould not connect to a network. Check if your custom server address is correct. If Tor is enabled in the game settings, check if Orbot is running and then try again.</string> <string name="error_network"><b>Network error!</b>\n\nCould not connect to a network. Check the system network settings, the game network settings and then try again.</string>
<string name="error_no_trivia_results"><b>No trivia results!</b>\n\nWas not able to find trivia questions that satisfied all options.</string> <string name="error_no_trivia_results"><b>No trivia results!</b>\n\nWas not able to find trivia questions that satisfied all options.</string>
<string name="error_server_response_invalid"><b>Server response error!</b>\n\nCould not parse the server response. The server response may be in a unsupported version. If you are using a custom server, make sure the server address points to a valid address and then try again.</string> <string name="error_server_response_invalid"><b>Server response error!</b>\n\nCould not parse the server response. The server response may be in a unsupported version. If you are using a custom server, make sure the server address points to a valid address and then try again.</string>
<string name="error_unknown"><b>An unknown error occurred!</b></string> <string name="error_unknown"><b>An unknown error occurred!</b></string>