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