diff --git a/src/itdelatrisu/opsu/Utils.java b/src/itdelatrisu/opsu/Utils.java index 6b8b6829..9b7e03de 100644 --- a/src/itdelatrisu/opsu/Utils.java +++ b/src/itdelatrisu/opsu/Utils.java @@ -43,6 +43,7 @@ import java.net.URL; import java.nio.ByteBuffer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; @@ -50,6 +51,10 @@ import java.util.Scanner; import java.util.jar.JarFile; import javax.imageio.ImageIO; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; import org.json.JSONArray; import org.json.JSONException; @@ -561,4 +566,28 @@ public class Utils { return null; } } + + /** + * Switches validation of SSL certificates on or off by installing a default + * all-trusting {@link TrustManager}. + * @param enabled whether to validate SSL certificates + * @author neu242 (http://stackoverflow.com/a/876785) + */ + public static void setSSLCertValidation(boolean enabled) { + // create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } + @Override public void checkClientTrusted(X509Certificate[] certs, String authType) {} + @Override public void checkServerTrusted(X509Certificate[] certs, String authType) {} + } + }; + + // install the all-trusting trust manager + try { + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, enabled ? null : trustAllCerts, null); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) {} + } } diff --git a/src/itdelatrisu/opsu/downloads/servers/YaSOnlineServer.java b/src/itdelatrisu/opsu/downloads/servers/YaSOnlineServer.java index 95846bfd..3d25459a 100644 --- a/src/itdelatrisu/opsu/downloads/servers/YaSOnlineServer.java +++ b/src/itdelatrisu/opsu/downloads/servers/YaSOnlineServer.java @@ -93,6 +93,8 @@ public class YaSOnlineServer extends DownloadServer { */ private String getDownloadURLFromMapData(int beatmapSetID) throws IOException { try { + Utils.setSSLCertValidation(false); + // read JSON String search = String.format(DOWNLOAD_URL, beatmapSetID); JSONObject json = Utils.readJsonObjectFromUrl(new URL(search)); @@ -114,6 +116,8 @@ public class YaSOnlineServer extends DownloadServer { } catch (MalformedURLException | UnsupportedEncodingException e) { ErrorHandler.error(String.format("Problem retrieving download URL for beatmap '%d'.", beatmapSetID), e, true); return null; + } finally { + Utils.setSSLCertValidation(true); } } @@ -121,6 +125,8 @@ public class YaSOnlineServer extends DownloadServer { public DownloadNode[] resultList(String query, int page, boolean rankedOnly) throws IOException { DownloadNode[] nodes = null; try { + Utils.setSSLCertValidation(false); + // read JSON String search; boolean isSearch; @@ -181,6 +187,8 @@ public class YaSOnlineServer extends DownloadServer { this.totalResults = maxServerID; } catch (MalformedURLException | UnsupportedEncodingException e) { ErrorHandler.error(String.format("Problem loading result list for query '%s'.", query), e, true); + } finally { + Utils.setSSLCertValidation(true); } return nodes; }