diff --git a/app/build.gradle b/app/build.gradle index 2ea288ce9b55c6f3e7ea080d19230e76e1747e72..277b964afac01fc00c2a2491e8cd488d1adae116 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 3a165f6b66b1a04fa0f9f39798071f403a6cd076..5d970ba63b15dd36c5cfd6bcf781d206f2806351 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 6672690bf35698ecb0323f0b295c0f10a6fe4717..ed8390d8aebf569fbcfe39e6db9be78fce3d0615 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 192c3c5987e8d99b9b48f18e6816ceadc3be2f3a..146258a289b48e9f43cc3920273327e322d4647d 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 8fc0e0bf1abdbca0e6709c9b2baa0f23607ba74b..6ade17ee8c1e4f6616ee93aad8ab612eae4bdf9b 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 cf295761d3520bc57268a68da0cb00f8183d7a9c..94546c408d40b5f1c6da79e20f8e0e7b9ccf136a 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