diff --git a/.gitignore b/.gitignore index d81e438..6d15748 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ tags .*.swp /.settings /*.iml +.idea diff --git a/ant.properties b/ant.properties deleted file mode 100644 index ee52d86..0000000 --- a/ant.properties +++ /dev/null @@ -1,17 +0,0 @@ -# This file is used to override default values used by the Ant build system. -# -# This file must be checked in Version Control Systems, as it is -# integral to the build system of your project. - -# This file is only used by the Ant script. - -# You can use this to override default values such as -# 'source.dir' for the location of your java source folder and -# 'out.dir' for the location of your output folder. - -# You can also use it define how the release builds are signed by declaring -# the following properties: -# 'key.store' for the location of your keystore and -# 'key.alias' for the name of the key to use. -# The password will be asked during the build when you use the 'release' target. - diff --git a/build.gradle b/build.gradle index 8a27fea..4fcc401 100644 --- a/build.gradle +++ b/build.gradle @@ -1,37 +1,9 @@ buildscript { - repositories { - mavenCentral() - google() - } - dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' - } -} - -apply plugin: 'com.android.library' - -repositories { - mavenCentral() - google() -} - -android { - compileSdkVersion 29 - defaultConfig { - minSdkVersion 9 - targetSdkVersion 29 - } - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - } - } - + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.6.0' + } } diff --git a/build.xml b/build.xml deleted file mode 100644 index 06cf485..0000000 --- a/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..13372ae Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..63eda80 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Aug 21 08:07:18 CEST 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/AndroidManifest.xml b/lib/AndroidManifest.xml similarity index 86% rename from AndroidManifest.xml rename to lib/AndroidManifest.xml index 11cb5ef..b20a9c0 100644 --- a/AndroidManifest.xml +++ b/lib/AndroidManifest.xml @@ -1,6 +1,5 @@ diff --git a/lib/build.gradle b/lib/build.gradle new file mode 100644 index 0000000..d409e3c --- /dev/null +++ b/lib/build.gradle @@ -0,0 +1,23 @@ +apply plugin: 'com.android.library' + +android { + namespace "de.duenndns.ssl" + defaultConfig { + minSdkVersion 9 + compileSdk 31 + targetSdkVersion 31 + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + } + +} diff --git a/res/values-de/strings.xml b/lib/res/values-de/strings.xml similarity index 83% rename from res/values-de/strings.xml rename to lib/res/values-de/strings.xml index ab5caea..a6b0968 100644 --- a/res/values-de/strings.xml +++ b/lib/res/values-de/strings.xml @@ -1,12 +1,10 @@ - Unbekanntes Zertifikat akzeptieren? Das Serverzertifikat stammt nicht von einer bekannten Ausstellungsstelle (CA). Das Serverzertifikat ist abgelaufen. Abweichenden Servernamen akzeptieren? Der Server konnte sich nicht als »%s« ausweisen. Das Zertifikat gilt nur für: - Verbindung trotzdem aufbauen? Zertifikatdetails: Immer diff --git a/res/values-es/strings.xml b/lib/res/values-es/strings.xml similarity index 83% rename from res/values-es/strings.xml rename to lib/res/values-es/strings.xml index c989db3..c638ff3 100644 --- a/res/values-es/strings.xml +++ b/lib/res/values-es/strings.xml @@ -1,12 +1,10 @@ - ¿Aceptar certicado desconocido? El certificado del servidor no está firmado por una Autoridad Conocida (CA). The server certificate is expired. ¿Aceptar discordancia en nombre del servidor? El servidor no ha podido autenticarte como \"%s\". El certificado es solo válido para: - ¿Quieres conectar de todas formas? Detalle del certificado: Siempre diff --git a/res/values-eu/strings.xml b/lib/res/values-eu/strings.xml similarity index 85% rename from res/values-eu/strings.xml rename to lib/res/values-eu/strings.xml index 6406998..39c7e32 100644 --- a/res/values-eu/strings.xml +++ b/lib/res/values-eu/strings.xml @@ -1,12 +1,10 @@ - Ziurtagiri ezezaguna onartu? Zerbitzariaren ziurtagiria ez dago Ziurtagiri-emaile Autoritate ezagun batez sinatuta. Zerbitzariaren ziurtagiria iraungi da. Zerbitzariaren izeneko desadostasuna onartu? Zerbitzaria ezin izan da \"%s\" bezala autentifikatu. Ziurtagiria soilik honetarako baliagarria da: - Konektatu hala ere? Ziurtagiriaren xehetasunak: Beti diff --git a/res/values-fi/strings.xml b/lib/res/values-fi/strings.xml similarity index 81% rename from res/values-fi/strings.xml rename to lib/res/values-fi/strings.xml index 6001b2d..bda99a4 100644 --- a/res/values-fi/strings.xml +++ b/lib/res/values-fi/strings.xml @@ -1,12 +1,10 @@ - Hyväksytäänkö palvelimen antama tuntematon varmenne? Palvelimen varmenne ei ole tunnetun varmentajan (CA) allekirjoittama. The server certificate is expired. Sallitaanko palvelimen nimi, joka ei vastaa varmeenteessa olevaa nimeä? Palvelimella ei ole varmennetta nimelle \"%s\". Varmenteen sisältämät nimet: - Haluatko jatkaa yhteyden muodostamista? Sertifikaatin tiedot: Aina diff --git a/res/values-fr/strings.xml b/lib/res/values-fr/strings.xml similarity index 83% rename from res/values-fr/strings.xml rename to lib/res/values-fr/strings.xml index c1fa6ec..6b7a95e 100644 --- a/res/values-fr/strings.xml +++ b/lib/res/values-fr/strings.xml @@ -1,12 +1,10 @@ - Accepter les certificats inconnus ? Le certificat du serveur n’est pas signé par une Autorité de Certification reconnue. Le certificat a expiré. Accepter le nom de serveur qui ne concorde pas ? Le serveur n\'a pas pu s\'authentifier comme « %s ». Le certificat est valide uniquement pour : - Voulez-vous vous connecter quand même ? Détails du certificat : Toujours diff --git a/res/values-iw/strings.xml b/lib/res/values-iw/strings.xml similarity index 82% rename from res/values-iw/strings.xml rename to lib/res/values-iw/strings.xml index 5b0619b..b49f1ba 100644 --- a/res/values-iw/strings.xml +++ b/lib/res/values-iw/strings.xml @@ -1,12 +1,10 @@ - לקבל תעודה לא מוכרת? תעודת השרת אינה חתומה על ידי Certificate Authority מוכר. The server certificate is expired. לקבל שם שרת לא תואם? שרת לא היה מסוגל לאמת בתור \"%s\". התעודה הינה ברת תוקף רק עבור: - האם ברצונך להתחבר בכל אופן? פרטי תעודה: תמיד diff --git a/res/values-no/strings.xml b/lib/res/values-no/strings.xml similarity index 83% rename from res/values-no/strings.xml rename to lib/res/values-no/strings.xml index 79fa296..63213a7 100644 --- a/res/values-no/strings.xml +++ b/lib/res/values-no/strings.xml @@ -1,12 +1,10 @@ - Godta ukjent sertifikat? Sertifikatet er ikke utstilt av en kjent utstiller (CA). The server certificate is expired. Godta feil servernavn? Serveren heter ikke \"%s\". Sertifikatet gjelder bare for: - Vil du bruke serveren likevel? Sertifikatdetaljer: Alltid diff --git a/res/values-ru/strings.xml b/lib/res/values-ru/strings.xml similarity index 83% rename from res/values-ru/strings.xml rename to lib/res/values-ru/strings.xml index 3259925..73fee70 100644 --- a/res/values-ru/strings.xml +++ b/lib/res/values-ru/strings.xml @@ -1,12 +1,10 @@ - Принять неизвестный сертификат? Сертификат сервера не подписан известным центром сертификации. Срок действия сертификата сервера истёк. Принять несоответствующее имя сервера? Сервер не может аутентифицироваться как \"%s\". Сертификат действителен только для: - Вы всё равно хотите подключиться? Сведения о сертификате: Всегда diff --git a/res/values-tr/strings.xml b/lib/res/values-tr/strings.xml similarity index 82% rename from res/values-tr/strings.xml rename to lib/res/values-tr/strings.xml index 63ae5d6..7509011 100644 --- a/res/values-tr/strings.xml +++ b/lib/res/values-tr/strings.xml @@ -1,12 +1,10 @@ - Bilinmeyen Sertifikayı Kabul Ediyor musunuz? Sunucu Sertifikası bilinen bir Sertifika Otoritesi tarafından imzalanmamıştır. The server certificate is expired. Eşleşmeyen Sunucu İsmi Kabul Edilsin mi? Sunucu \"%s\" olarak kimliğini teyit edemedi. Sertifika sadece şunun için geçerlidir: - Gene de bağlanmak istiyor musunuz? Sertifika detayları: Daima diff --git a/res/values-zh-rCN/strings.xml b/lib/res/values-zh-rCN/strings.xml similarity index 82% rename from res/values-zh-rCN/strings.xml rename to lib/res/values-zh-rCN/strings.xml index a1f4bc1..623c264 100644 --- a/res/values-zh-rCN/strings.xml +++ b/lib/res/values-zh-rCN/strings.xml @@ -1,12 +1,10 @@ - 是否接受未知的证书? 服务器证书没有被签名 The server certificate is expired. 是否接受不匹配的服务器名 服务器不能给\"%s\"授权. 证书只对:有效 - Do you want to connect anyway? 证书详情 总是 diff --git a/res/values/strings.xml b/lib/res/values/strings.xml similarity index 100% rename from res/values/strings.xml rename to lib/res/values/strings.xml diff --git a/lib/settings.gradle b/lib/settings.gradle new file mode 100644 index 0000000..96d5088 --- /dev/null +++ b/lib/settings.gradle @@ -0,0 +1,9 @@ +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +include ':example' diff --git a/src/de/duenndns/ssl/MTMDecision.java b/lib/src/de/duenndns/ssl/MTMDecision.java similarity index 100% rename from src/de/duenndns/ssl/MTMDecision.java rename to lib/src/de/duenndns/ssl/MTMDecision.java diff --git a/src/de/duenndns/ssl/MemorizingActivity.java b/lib/src/de/duenndns/ssl/MemorizingActivity.java similarity index 100% rename from src/de/duenndns/ssl/MemorizingActivity.java rename to lib/src/de/duenndns/ssl/MemorizingActivity.java diff --git a/src/de/duenndns/ssl/MemorizingTrustManager.java b/lib/src/de/duenndns/ssl/MemorizingTrustManager.java similarity index 98% rename from src/de/duenndns/ssl/MemorizingTrustManager.java rename to lib/src/de/duenndns/ssl/MemorizingTrustManager.java index 3e4236f..aca8bf2 100644 --- a/src/de/duenndns/ssl/MemorizingTrustManager.java +++ b/lib/src/de/duenndns/ssl/MemorizingTrustManager.java @@ -37,6 +37,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.util.Log; import android.util.SparseArray; import android.os.Build; import android.os.Handler; @@ -167,7 +168,7 @@ void init(Context m) { File dir = app.getDir(KEYSTORE_DIR, Context.MODE_PRIVATE); keyStoreFile = new File(dir + File.separator + KEYSTORE_FILE); - + LOGGER.log(Level.INFO, "init(): Using keyStoreFile " + keyStoreFile.getPath()); appKeyStore = loadAppKeyStore(); } @@ -362,13 +363,14 @@ KeyStore loadAppKeyStore() { void storeCert(String alias, Certificate cert) { try { appKeyStore.setCertificateEntry(alias, cert); + LOGGER.log(Level.INFO, "storeCert(" + alias + ")"); } catch (KeyStoreException e) { LOGGER.log(Level.SEVERE, "storeCert(" + cert + ")", e); return; - } + } keyStoreUpdated(); } - + void storeCert(X509Certificate cert) { storeCert(cert.getSubjectDN().toString(), cert); } @@ -425,7 +427,7 @@ private static boolean isPathException(Throwable e) { public void checkCertTrusted(X509Certificate[] chain, String authType, boolean isServer) throws CertificateException { - LOGGER.log(Level.FINE, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")"); + LOGGER.log(Level.INFO, "checkCertTrusted(" + chain + ", " + authType + ", " + isServer + ")"); try { LOGGER.log(Level.FINE, "checkCertTrusted: trying appTrustManager"); if (isServer) @@ -549,7 +551,7 @@ private void certDetails(StringBuilder si, X509Certificate c) { si.append(c.getIssuerDN().toString()); si.append("\n"); } - + private String certChainMessage(final X509Certificate[] chain, CertificateException cause) { Throwable e = cause; LOGGER.log(Level.FINE, "certChainMessage for " + e); @@ -619,8 +621,11 @@ private static void setLatestEventInfoReflective(Notification notification, @TargetApi(Build.VERSION_CODES.HONEYCOMB) void startActivityNotification(Intent intent, int decisionId, String certName) { Notification notification; - final PendingIntent call = PendingIntent.getActivity(master, 0, intent, - 0); + int flags = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + flags |= PendingIntent.FLAG_MUTABLE; + } + final PendingIntent call = PendingIntent.getActivity(master, 0, intent, flags); final String mtmNotification = master.getString(R.string.mtm_notification); final long currentMillis = System.currentTimeMillis(); final Context context = master.getApplicationContext(); @@ -683,9 +688,9 @@ public void run() { // invalid / expired activity, the catch-all fallback is // deployed. try { - foregroundAct.startActivity(ni); + getUI().startActivity(ni); } catch (Exception e) { - LOGGER.log(Level.FINE, "startActivity(MemorizingActivity)", e); + LOGGER.log(Level.SEVERE, "startActivity(MemorizingActivity)", e); startActivityNotification(ni, myId, message); } } @@ -700,7 +705,7 @@ public void run() { LOGGER.log(Level.FINE, "finished wait on " + myId + ": " + choice.state); return choice.state; } - + void interactCert(final X509Certificate[] chain, String authType, CertificateException cause) throws CertificateException { @@ -741,10 +746,10 @@ protected static void interactResult(int decisionId, int choice) { d.notify(); } } - + class MemorizingHostnameVerifier implements HostnameVerifier { private HostnameVerifier defaultVerifier; - + public MemorizingHostnameVerifier(HostnameVerifier wrapped) { defaultVerifier = wrapped; } diff --git a/libs/.android_sucks b/libs/.android_sucks deleted file mode 100644 index e69de29..0000000 diff --git a/project.properties b/project.properties deleted file mode 100644 index cb55769..0000000 --- a/project.properties +++ /dev/null @@ -1,12 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -android.library=true -# Project target. -target=android-23 diff --git a/settings.gradle b/settings.gradle index ff1d046..0720016 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,13 @@ -include ':example' +pluginManagement { + repositories { + google() + mavenCentral() + } +} +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } +} +include ':lib'