From b3a300f1a7fe07a5d0130518dea463ce20a04558 Mon Sep 17 00:00:00 2001 From: Nitorac <nitorac.r@gmail.com> Date: Thu, 8 Oct 2020 00:26:59 +0200 Subject: [PATCH] Fixed crash on startup Fixed wrong charset name Fixed correct SSL check --- app/build.gradle | 4 +-- .../main/java/fr/nitorac/aurionweb/Utils.java | 13 +++++----- .../fragments/AurionViewFragment.java | 26 ++++++++++++++++--- .../fragments/calendar/CalendarFragment.java | 9 +++++-- .../fragments/home/HomeFragment.java | 5 +++- .../update/AsyncUpdateCheckerTask.java | 2 +- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2ea288c..277b964 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "fr.nitorac.aurionweb" minSdkVersion 19 targetSdkVersion 29 - versionCode 1 - versionName "1.0.0" + versionCode 3 + versionName "1.0.2" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/fr/nitorac/aurionweb/Utils.java b/app/src/main/java/fr/nitorac/aurionweb/Utils.java index 3a165f6..5d970ba 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/Utils.java +++ b/app/src/main/java/fr/nitorac/aurionweb/Utils.java @@ -21,6 +21,7 @@ import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.text.CharacterIterator; import java.text.Normalizer; import java.text.StringCharacterIterator; @@ -33,8 +34,8 @@ public class Utils { public final static String BASE_SSL_URL = "https://ranini.iiens.net/aurionweb-check/cert.php?site="; private static SSLContext sslContext; - private static Certificate casCert; - private static Certificate aurionCert; + private static X509Certificate casCert; + private static X509Certificate aurionCert; public static Connection wrapSSL(String url) throws GeneralSecurityException, IOException { return Jsoup.connect(url) @@ -45,7 +46,7 @@ public class Utils { return CertificateFactory.getInstance("X.509"); } - public static Certificate getCasCert(Context c) throws CertificateException { + public static X509Certificate getCasCert(Context c) throws CertificateException { if (casCert == null){ InputStream input; try{ @@ -57,12 +58,12 @@ public class Utils { Log.e("SSLCertFetch", "Can't get remote SSL cas certificate, fallback on local one"); input = c.getResources().openRawResource(R.raw.cas_ensiie_fr); } - casCert = getSSLFactory().generateCertificate(input); + casCert = (X509Certificate) getSSLFactory().generateCertificate(input); } return casCert; } - public static Certificate getAurionCert(Context c) throws CertificateException { + public static X509Certificate getAurionCert(Context c) throws CertificateException { if (aurionCert == null){ InputStream input; try{ @@ -74,7 +75,7 @@ public class Utils { Log.e("SSLCertFetch", "Can't get remote SSL aurion certificate, fallback on local one"); input = c.getResources().openRawResource(R.raw.aurionweb_ensiie_fr); } - aurionCert = getSSLFactory().generateCertificate(input); + aurionCert = (X509Certificate) getSSLFactory().generateCertificate(input); } return aurionCert; } diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java index 6672690..ed8390d 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java +++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java @@ -1,6 +1,7 @@ package fr.nitorac.aurionweb.fragments; import android.content.Context; +import android.net.http.SslCertificate; import android.net.http.SslError; import android.os.Build; import android.os.Bundle; @@ -17,10 +18,10 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import fr.nitorac.aurionweb.R; import fr.nitorac.aurionweb.Utils; @@ -89,9 +90,26 @@ public abstract class AurionViewFragment extends Fragment { public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) { Context c = AurionViewFragment.this.getContext(); try{ - Certificate cas = Utils.getCasCert(c); - Certificate aurion = Utils.getAurionCert(c); - handler.proceed(); + SslCertificate cas = new SslCertificate(Utils.getCasCert(c)); + SslCertificate aurion = new SslCertificate(Utils.getAurionCert(c)); + SslCertificate erCert = er.getCertificate(); + + if(Build.VERSION.SDK_INT > Build.VERSION_CODES.Q){ + if(Objects.equals(aurion.getX509Certificate(), erCert.getX509Certificate()) || + Objects.equals(cas.getX509Certificate(), erCert.getX509Certificate())){ + handler.proceed(); + }else{ + handler.cancel(); + } + }else{ + // Minimal verification but Android won't let me convert SslCertificate to Certificate + if((Objects.equals(cas.getIssuedBy(), erCert.getIssuedBy()) && Objects.equals(cas.getIssuedTo(), erCert.getIssuedTo()) && Objects.equals(cas.getValidNotAfterDate(), erCert.getValidNotAfterDate()) && Objects.equals(cas.getValidNotBeforeDate(), erCert.getValidNotBeforeDate())) || + (Objects.equals(aurion.getIssuedBy(), erCert.getIssuedBy()) && Objects.equals(aurion.getIssuedTo(), erCert.getIssuedTo()) && Objects.equals(aurion.getValidNotAfterDate(), erCert.getValidNotAfterDate()) && Objects.equals(aurion.getValidNotBeforeDate(), erCert.getValidNotBeforeDate()))){ + handler.proceed(); + }else{ + handler.cancel(); + } + } }catch (CertificateException e){ e.printStackTrace(); Toast.makeText(c, "Erreur de certificat SSL : " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java index 192c3c5..146258a 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java +++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java @@ -24,8 +24,13 @@ public class CalendarFragment extends AurionViewFragment { e.printStackTrace(); failed = true; Log.e(getClass().getSimpleName(), "Impossible de charger le chemin vers l'emploi du temps (" + e.getLocalizedMessage() + ")"); - Toast.makeText(getContext(), "Impossible de charger le chemin vers l'emploi du temps (" + e.getLocalizedMessage() + ")", Toast.LENGTH_LONG).show(); - webView.loadUrl(HomeFragment.AURIONURL, getHeaders()); + if(getActivity() != null){ + getActivity().runOnUiThread(() -> { + Toast.makeText(getContext(), "Impossible de charger le chemin vers l'emploi du temps (" + e.getLocalizedMessage() + ")", Toast.LENGTH_LONG).show(); + webView.loadUrl(HomeFragment.AURIONURL, getHeaders()); + }); + } + } } diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java index 8fc0e0b..6ade17e 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java +++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java @@ -9,12 +9,15 @@ public class HomeFragment extends AurionViewFragment { public static final String AURIONURL = "https://aurionweb.ensiie.fr"; + private boolean hasLoaded = false; + @Override public void pageFinished(WebView view, String url) { - if(url.equals("https://aurionweb.ensiie.fr")){ + if(!hasLoaded){ view.evaluateJavascript("$(\"#mobile-menu-btn\").click();", paRes -> { Log.e("JSSS", paRes); }); + hasLoaded = true; } } diff --git a/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java b/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java index cf29576..94546c4 100644 --- a/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java +++ b/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java @@ -28,7 +28,7 @@ public class AsyncUpdateCheckerTask extends AsyncTask<Void, Void, JsonObject> { @Override protected JsonObject doInBackground(Void... voids) { try { - URL url = new URL(UpdateManager.CHECK_URL + URLEncoder.encode(BuildConfig.VERSION_NAME, StandardCharsets.UTF_8.toString())); + URL url = new URL(UpdateManager.CHECK_URL + URLEncoder.encode(BuildConfig.VERSION_NAME, StandardCharsets.UTF_8.displayName())); HttpURLConnection conn=(HttpURLConnection) url.openConnection(); conn.setConnectTimeout(10000); // timing out in a minute -- GitLab