From 7f2ca474904a137e8fd385225a684d999bd92264 Mon Sep 17 00:00:00 2001 From: dllewellyn Date: Fri, 29 Sep 2023 08:23:26 +0100 Subject: [PATCH] 132 re structure off device classes into a separate module (#134) * Bumping version number to a major version * Removing logger, app and safe to run plus into separate modules * All off-device login will go into safetorunplus in a separate module to reduce binary size * App is removed due to the un-needed time it adds to build and import times --- .github/workflows/build.yml | 60 +----- app/.classpath | 6 - app/.gitignore | 1 - app/.project | 34 ---- .../org.eclipse.buildship.core.prefs | 2 - app/build.gradle | 94 --------- app/buildSrc/configuration.json | 71 ------- app/proguard-rules.pro | 21 -- .../java/com/andro/secure/BouncyIntentTest.kt | 35 ---- .../com/andro/secure/FileVerificationTest.kt | 170 ---------------- .../com/andro/secure/UrlVerificationTest.kt | 52 ----- .../andro/secure/util/WaitForTextAction.kt | 3 - app/src/main/AndroidManifest.xml | 75 ------- app/src/main/assets/evil.html | 4 - app/src/main/assets/index.html | 16 -- .../java/com/andro/secure/MainActivity.kt | 94 --------- .../com/andro/secure/ProtectedActivity.kt | 14 -- .../andro/secure/intents/BouncableActivity.kt | 33 --- .../secure/intents/DisplayFileActivity.kt | 51 ----- .../intents/SensitiveBroadcastReceiver.kt | 13 -- .../andro/secure/intents/WebViewActivity.kt | 63 ------ .../java/com/andro/secure/package-info.java | 7 - .../com/andro/secure/report/ReportFragment.kt | 107 ---------- .../main/java/com/andro/secure/util/Log.kt | 5 - .../com/andro/secure/webview/WebViewSample.kt | 64 ------ .../drawable-v24/ic_launcher_foreground.xml | 30 --- app/src/main/res/drawable/check.png | Bin 17898 -> 0 bytes app/src/main/res/drawable/close.png | Bin 13251 -> 0 bytes .../res/drawable/ic_launcher_background.xml | 170 ---------------- app/src/main/res/drawable/warning.png | Bin 21799 -> 0 bytes .../main/res/layout/activity_bouncable.xml | 15 -- app/src/main/res/layout/activity_main.xml | 22 -- app/src/main/res/layout/activity_web_view.xml | 21 -- .../main/res/layout/display_file_activity.xml | 9 - .../main/res/layout/protected_activity.xml | 16 -- app/src/main/res/layout/report_fragment.xml | 27 --- app/src/main/res/layout/simple_list_item.xml | 34 ---- app/src/main/res/layout/web_view_fragment.xml | 9 - app/src/main/res/menu/main_menu.xml | 7 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3593 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5339 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2636 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 3388 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4926 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7472 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7909 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 11873 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10652 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 16570 -> 0 bytes app/src/main/res/navigation/main_nav.xml | 16 -- app/src/main/res/raw/testfile.txt | 1 - app/src/main/res/values/colors.xml | 6 - app/src/main/res/values/dimens.xml | 4 - app/src/main/res/values/strings.xml | 7 - app/src/main/res/values/styles.xml | 10 - app/src/main/res/xml/filepaths.xml | 3 - build.gradle | 4 +- gradle.properties | 9 +- gradle/libs.versions.toml | 6 +- safeToRun/build.gradle | 1 - .../com/safetorun/SafeToRunOffDeviceTest.kt | 41 ---- .../java/com/safetorun/api/ApiException.kt | 13 -- .../com/safetorun/api/DefaultHttpClient.kt | 87 -------- .../com/safetorun/api/DefaultSafeToRunApi.kt | 59 ------ .../java/com/safetorun/api/SafeToRunApi.kt | 12 -- .../com/safetorun/api/SafeToRunHttpClient.kt | 17 -- .../exploration/DeviceInformation.kt | 34 ---- .../safetorun/exploration/InstallOrigin.kt | 6 - .../java/com/safetorun/exploration/OsCheck.kt | 16 -- .../exploration/SignatureInformation.kt | 8 - .../AndroidInstalledPackagesQuery.kt | 20 -- .../blacklistedapps/InstalledPackagesQuery.kt | 5 - .../features/oscheck/OSConfigurationChecks.kt | 2 - .../oscheck/OSInformationQueryAndroid.kt | 1 + .../features/oscheck/emulator/emulators.kt | 2 +- .../java/com/safetorun/inline/safeToRun.kt | 83 -------- .../offdevice/AndroidSafeToRunOffDevice.kt | 182 ----------------- .../offdevice/OffDeviceResultBuilder.kt | 19 -- .../safetorun/offdevice/SafeToRunOffDevice.kt | 23 --- .../offdevice/SafeToRunOffDeviceResult.kt | 8 - .../BlacklistedAppsOffDeviceBuilder.kt | 18 -- .../offdevice/builders/CompositeBuilder.kt | 17 -- .../builders/InstallOriginOffDeviceBuilder.kt | 16 -- .../builders/OSCheckOffDeviceBuilder.kt | 24 --- .../builders/RootCheckOffDeviceBuilder.kt | 15 -- .../SignatureVerificationOffDeviceBuilder.kt | 21 -- .../safetorun/reporting/BaseAndroidStrings.kt | 10 - .../reporting/LoggerBackendSynchroniser.kt | 47 ----- .../repository/AndroidDeviceIdRepository.kt | 35 ---- .../repository/DeviceIdRepository.kt | 6 - .../safetorun/api/DefaultHttpClientKtTest.kt | 18 -- .../DefaultISafeToRunApiIntegrationTest.kt | 67 ------ .../safetorun/api/DefaultSafeToRunApiTest.kt | 106 ---------- .../test/kotlin/com/safetorun/api/shared.kt | 22 -- .../exploration/DeviceInformationKtTest.kt | 40 ---- .../AndroidSafeToRunOffDeviceKtTest.kt | 23 --- .../AndroidSafeToRunOffDeviceTest.kt | 191 ------------------ .../safetorun/offdevice/FakeSharedPrefs.kt | 97 --------- .../AndroidInstalledPackagesQueryTest.kt | 50 ----- .../BlacklistedAppsOffDeviceBuilderTest.kt | 33 --- .../builders/CompositeBuilderTest.kt | 36 ---- .../InstallOriginOffDeviceBuilderTest.kt | 46 ----- .../builders/OSCheckOffDeviceBuilderTest.kt | 49 ----- .../builders/RootCheckOffDeviceBuilderTest.kt | 27 --- ...gnatureVerificationOffDeviceBuilderTest.kt | 44 ---- .../LoggerBackendSynchroniserTest.kt | 58 ------ .../AndroidDeviceIdRepositoryTest.kt | 37 ---- safeToRunInputValidation/build.gradle | 6 - .../builders/DeviceInformationBuilder.kt | 69 ------- .../builders/DeviceInformationDtoBuilder.kt | 81 -------- .../builders/IDeviceInformationBuilder.kt | 26 --- .../builders/IOsHardwareInformationBuilder.kt | 37 ---- .../builders/IOsInformationDtoBuilder.kt | 40 ---- .../builders/OsHardwareInformationBuilder.kt | 36 ---- .../builders/OsInformationDtoBuilder.kt | 81 -------- .../models/models/BlacklistedAppsDto.kt | 11 - .../models/ConfirmVerificationRequestDto.kt | 12 -- .../models/models/DataWrappedLogResponse.kt | 7 - .../models/DataWrappedSignatureResult.kt | 9 - .../models/models/DataWrappedVerifyResult.kt | 11 - .../models/models/DeviceInformationDto.kt | 18 -- .../models/models/DeviceSignatureDto.kt | 11 - .../models/models/InstallOriginDto.kt | 9 - .../com/safetorun/models/models/OsCheckDto.kt | 19 -- .../models/models/SafeToRunResult.kt | 32 --- .../models/models/SignatureVerificationDto.kt | 9 - .../safetorun/models/models/VerifierResult.kt | 20 -- safeToRunLogger/build.gradle.kts | 65 ------ .../com/safetorun/logger/AndroidDataStore.kt | 23 --- .../com/safetorun/logger/JvmDatastore.kt | 66 ------ .../logger/metadata/MetadataBuilder.kt | 48 ----- .../safetorun/logger/BackendSynchKtTest.kt | 139 ------------- .../com/safetorun/logger/JvmDataStoreTest.kt | 152 -------------- .../kotlin/com/safetorun/logger/SharedTest.kt | 35 ---- .../com/safetorun/logger/WithLoggerKtTest.kt | 69 ------- .../logger/metadata/MetadataBuilderTest.kt | 67 ------ .../com/safetorun/logger/BackendSynch.kt | 110 ---------- .../kotlin/com/safetorun/logger/DataStore.kt | 13 -- .../kotlin/com/safetorun/logger/WithLogger.kt | 25 --- .../safetorun/logger/models/AppMetadata.kt | 21 -- .../logger/models/BlacklistedApps.kt | 9 - .../logger/models/DeviceInformation.kt | 26 --- .../logger/models/DeviceSignature.kt | 9 - .../safetorun/logger/models/InstallOrigin.kt | 7 - .../com/safetorun/logger/models/OsCheck.kt | 18 -- .../logger/models/OsHardwareInformation.kt | 10 - .../logger/models/SafeToRunEvents.kt | 85 -------- .../android_test_dependencies.gradle | 2 +- scripts/dependencies/test_dependencies.gradle | 10 +- settings.gradle.kts | 2 - 152 files changed, 16 insertions(+), 4862 deletions(-) delete mode 100644 app/.classpath delete mode 100644 app/.gitignore delete mode 100644 app/.project delete mode 100644 app/.settings/org.eclipse.buildship.core.prefs delete mode 100644 app/build.gradle delete mode 100644 app/buildSrc/configuration.json delete mode 100644 app/proguard-rules.pro delete mode 100644 app/src/androidTest/java/com/andro/secure/BouncyIntentTest.kt delete mode 100644 app/src/androidTest/java/com/andro/secure/FileVerificationTest.kt delete mode 100644 app/src/androidTest/java/com/andro/secure/UrlVerificationTest.kt delete mode 100644 app/src/androidTest/java/com/andro/secure/util/WaitForTextAction.kt delete mode 100644 app/src/main/AndroidManifest.xml delete mode 100644 app/src/main/assets/evil.html delete mode 100644 app/src/main/assets/index.html delete mode 100644 app/src/main/java/com/andro/secure/MainActivity.kt delete mode 100644 app/src/main/java/com/andro/secure/ProtectedActivity.kt delete mode 100644 app/src/main/java/com/andro/secure/intents/BouncableActivity.kt delete mode 100644 app/src/main/java/com/andro/secure/intents/DisplayFileActivity.kt delete mode 100644 app/src/main/java/com/andro/secure/intents/SensitiveBroadcastReceiver.kt delete mode 100644 app/src/main/java/com/andro/secure/intents/WebViewActivity.kt delete mode 100644 app/src/main/java/com/andro/secure/package-info.java delete mode 100644 app/src/main/java/com/andro/secure/report/ReportFragment.kt delete mode 100644 app/src/main/java/com/andro/secure/util/Log.kt delete mode 100644 app/src/main/java/com/andro/secure/webview/WebViewSample.kt delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 app/src/main/res/drawable/check.png delete mode 100644 app/src/main/res/drawable/close.png delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 app/src/main/res/drawable/warning.png delete mode 100644 app/src/main/res/layout/activity_bouncable.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_web_view.xml delete mode 100644 app/src/main/res/layout/display_file_activity.xml delete mode 100644 app/src/main/res/layout/protected_activity.xml delete mode 100644 app/src/main/res/layout/report_fragment.xml delete mode 100644 app/src/main/res/layout/simple_list_item.xml delete mode 100644 app/src/main/res/layout/web_view_fragment.xml delete mode 100644 app/src/main/res/menu/main_menu.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/navigation/main_nav.xml delete mode 100644 app/src/main/res/raw/testfile.txt delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/styles.xml delete mode 100644 app/src/main/res/xml/filepaths.xml delete mode 100644 safeToRun/src/androidTest/java/com/safetorun/SafeToRunOffDeviceTest.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/api/ApiException.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/api/DefaultHttpClient.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/api/DefaultSafeToRunApi.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/api/SafeToRunApi.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/api/SafeToRunHttpClient.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/exploration/DeviceInformation.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/exploration/InstallOrigin.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/exploration/OsCheck.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/exploration/SignatureInformation.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/features/blacklistedapps/AndroidInstalledPackagesQuery.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/features/blacklistedapps/InstalledPackagesQuery.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/AndroidSafeToRunOffDevice.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/OffDeviceResultBuilder.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/SafeToRunOffDevice.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/SafeToRunOffDeviceResult.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/builders/BlacklistedAppsOffDeviceBuilder.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/builders/CompositeBuilder.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/builders/InstallOriginOffDeviceBuilder.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/builders/OSCheckOffDeviceBuilder.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/builders/RootCheckOffDeviceBuilder.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/offdevice/builders/SignatureVerificationOffDeviceBuilder.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/reporting/BaseAndroidStrings.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/reporting/LoggerBackendSynchroniser.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/repository/AndroidDeviceIdRepository.kt delete mode 100644 safeToRun/src/main/java/com/safetorun/repository/DeviceIdRepository.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/api/DefaultHttpClientKtTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/api/DefaultISafeToRunApiIntegrationTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/api/DefaultSafeToRunApiTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/api/shared.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/exploration/DeviceInformationKtTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/AndroidSafeToRunOffDeviceKtTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/AndroidSafeToRunOffDeviceTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/FakeSharedPrefs.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/builders/AndroidInstalledPackagesQueryTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/builders/BlacklistedAppsOffDeviceBuilderTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/builders/CompositeBuilderTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/builders/InstallOriginOffDeviceBuilderTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/builders/OSCheckOffDeviceBuilderTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/builders/RootCheckOffDeviceBuilderTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/offdevice/builders/SignatureVerificationOffDeviceBuilderTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/reporting/LoggerBackendSynchroniserTest.kt delete mode 100644 safeToRun/src/test/kotlin/com/safetorun/repository/AndroidDeviceIdRepositoryTest.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/builders/DeviceInformationBuilder.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/builders/DeviceInformationDtoBuilder.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/builders/IDeviceInformationBuilder.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/builders/IOsHardwareInformationBuilder.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/builders/IOsInformationDtoBuilder.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/builders/OsHardwareInformationBuilder.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/builders/OsInformationDtoBuilder.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/BlacklistedAppsDto.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/ConfirmVerificationRequestDto.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/DataWrappedLogResponse.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/DataWrappedSignatureResult.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/DataWrappedVerifyResult.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/DeviceInformationDto.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/DeviceSignatureDto.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/InstallOriginDto.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/OsCheckDto.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/SafeToRunResult.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/SignatureVerificationDto.kt delete mode 100644 safeToRunInternal/src/main/kotlin/com/safetorun/models/models/VerifierResult.kt delete mode 100644 safeToRunLogger/build.gradle.kts delete mode 100644 safeToRunLogger/src/androidMain/kotlin/com/safetorun/logger/AndroidDataStore.kt delete mode 100644 safeToRunLogger/src/androidMain/kotlin/com/safetorun/logger/JvmDatastore.kt delete mode 100644 safeToRunLogger/src/androidMain/kotlin/com/safetorun/logger/metadata/MetadataBuilder.kt delete mode 100644 safeToRunLogger/src/androidTest/kotlin/com/safetorun/logger/BackendSynchKtTest.kt delete mode 100644 safeToRunLogger/src/androidTest/kotlin/com/safetorun/logger/JvmDataStoreTest.kt delete mode 100644 safeToRunLogger/src/androidTest/kotlin/com/safetorun/logger/SharedTest.kt delete mode 100644 safeToRunLogger/src/androidTest/kotlin/com/safetorun/logger/WithLoggerKtTest.kt delete mode 100644 safeToRunLogger/src/androidTest/kotlin/com/safetorun/logger/metadata/MetadataBuilderTest.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/BackendSynch.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/DataStore.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/WithLogger.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/AppMetadata.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/BlacklistedApps.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/DeviceInformation.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/DeviceSignature.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/InstallOrigin.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/OsCheck.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/OsHardwareInformation.kt delete mode 100644 safeToRunLogger/src/commonMain/kotlin/com/safetorun/logger/models/SafeToRunEvents.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44ef41b4..b34c042e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,14 +14,6 @@ jobs: timeout-minutes: 30 runs-on: ubuntu-latest steps: - - uses: actions/cache@v3 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - name: Setup Java JDK uses: actions/setup-java@v3.9.0 with: @@ -35,54 +27,4 @@ jobs: env: SERVER_URL: 'http://example.com' API_KEY: 'apikey' - - name: Upload Android Test APK - uses: actions/upload-artifact@v1 - with: - name: app-debug-androidTest - path: app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk - - name: Upload app APK - uses: actions/upload-artifact@v1 - with: - name: app-debug - path: app/build/outputs/apk/debug/app-debug.apk - - name: Upload Android Test APK (Pin screen) - uses: actions/upload-artifact@v1 - with: - name: app-debug-androidTest-pin - path: safetorunpinscreen/build/outputs/apk/androidTest/debug/safetorunpinscreen-debug-androidTest.apk - - name: Upload app APK (Pin screen) - uses: actions/upload-artifact@v1 - with: - name: app-debug-pin - path: app/build/outputs/apk/debug/app-debug.apk - - firebaseTest: - runs-on: ubuntu-latest - needs: build - steps: - - uses: actions/checkout@v2 - - name: Download app APK - uses: actions/download-artifact@v1 - with: - name: app-debug - - - name: Download Android test APK - uses: actions/download-artifact@v1 - with: - name: app-debug-androidTest - - - name: Login to Google Cloud - uses: google-github-actions/setup-gcloud@v0 - with: - service_account_key: ${{ secrets.GCLOUD_AUTH }} - - name: print secrets - run: | - echo $AUTH_KEY >> google-service-key.json - shell: bash - env: - AUTH_KEY : ${{secrets.GCLOUD_AUTH}} - - name: Set project id - run: gcloud config set project ${{ secrets.FIREBASE_PROJECT_ID }} - - - name: Run Instrumentation Tests in Firebase Test Lab - run: gcloud firebase test android run --type instrumentation --app app-debug/app-debug.apk --test app-debug-androidTest/app-debug-androidTest.apk --device-ids=redfin,star2lte,judypn --os-version-ids=28,29,30 + \ No newline at end of file diff --git a/app/.classpath b/app/.classpath deleted file mode 100644 index 4a04201c..00000000 --- a/app/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/app/.project b/app/.project deleted file mode 100644 index 879a948f..00000000 --- a/app/.project +++ /dev/null @@ -1,34 +0,0 @@ - - - app - Project app created by Buildship. - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.buildship.core.gradleprojectnature - - - - 1635932539805 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - - diff --git a/app/.settings/org.eclipse.buildship.core.prefs b/app/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index b1886adb..00000000 --- a/app/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir=.. -eclipse.preferences.version=1 diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 44c2c290..00000000 --- a/app/build.gradle +++ /dev/null @@ -1,94 +0,0 @@ -plugins { - id "com.safetorun.builder" - id 'org.jetbrains.kotlinx.kover' -} -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' -def directory = "$rootProject.projectDir/scripts/dependencies/" -apply from: "$directory/android_test_dependencies.gradle" - - -android { - compileSdkVersion 33 - - defaultConfig { - applicationId "com.andro.secure" - minSdkVersion 24 - targetSdkVersion 33 - versionCode 1 - versionName "1.0" - multiDexEnabled true - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildFeatures { - viewBinding true - dataBinding true - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_11.toString() - } - - buildTypes { - def serverUrl = System.getenv("SERVER_URL") ?: SERVER_URL - def apiKey = System.getenv("API_KEY") ?: API_KEY - - debug { - buildConfigField "String", "SERVER_URL", "\"$serverUrl\"" - buildConfigField "String", "API_KEY", "\"$apiKey\"" - } - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - buildConfigField "String", "SERVER_URL", "\"$serverUrl\"" - buildConfigField "String", "API_KEY", "\"$apiKey\"" - } - } - namespace 'com.andro.secure' -} - -dependencies { - - def nav_version = "2.5.3" - - implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" - implementation "androidx.navigation:navigation-ui-ktx:$nav_version" - - implementation project(":safeToRun") - implementation project(":safeToRunInputValidation") - implementation project(":safeToRunLogger") - - implementation("com.auth0:java-jwt:$jwtVersion") - implementation "com.airbnb.android:epoxy:$epoxyVersion" - implementation "com.airbnb.android:epoxy-databinding:$epoxyVersion" - implementation "androidx.recyclerview:recyclerview:$recyclerView" - kapt "com.airbnb.android:epoxy-processor:$epoxyVersion" - implementation 'androidx.core:core-ktx:1.10.1' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - testImplementation 'junit:junit:4.13.2' -} - -apply plugin: 'firebase.test.lab' - -firebaseTestLab { - keyFile = file("../google-service-key.json") - googleProjectId = "andro-3982e" - devices { - nexusEmulator { - deviceIds = ["redfin", "star2lte", "judypn"] - androidApiLevels = [28, 29, 30] - } - } -} - -safeToRun { - configurationPath = "buildSrc/configuration.json" - generatedCodePath = "src/main/java" -} diff --git a/app/buildSrc/configuration.json b/app/buildSrc/configuration.json deleted file mode 100644 index 844b2451..00000000 --- a/app/buildSrc/configuration.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "backendResilience": {}, - "inputVerification": { - "url_verifications": [ - { - "name": "example_configuration", - "configuration": { - "allowed_hosts": [ - "safetorun.com" - ], - "allowed_urls": [ - "https://safetorun.com?abc=def" - ], - "allowed_parameters": [ - { - "parameter_name": "blah", - "allowed_type": "String" - } - ], - "allow_any_parameter": false, - "allow_any_url": false - } - } - ], - "file_verifications": [ - { - "name": "file_verifier", - "configuration": { - "allow_any_file": false, - "allowed_exact_files": [ - "/data/data/com.blah/abc" - ], - "allowed_parent_directories": [ - { - "directory": "/data/data/com.blah/parent", - "allowSubdirectories": false - } - ] - } - } - ] - }, - "ondeviceResilience": { - "blacklistedApps": [ - "com.abc" - ], - "allowedSignatures": [ - "ABASDASD", - "BBBBBBB" - ], - "osCheckConfiguration": [ - { - "allIntChecks": [ - { - "intValue": 31, - "comparator": "GREATER_THAN", - "checkUuid": "39e31092-a8cb-4576-9252-dead833cd8d6" - } - ], - "unlessIntChecks": [ - { - "intValue": 30, - "comparator": "GREATER_THAN", - "checkUuid": "9c0318c1-9418-456f-bfc2-21e4b66c88a8" - } - ] - } - ], - "banDebugger": true - } -} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/andro/secure/BouncyIntentTest.kt b/app/src/androidTest/java/com/andro/secure/BouncyIntentTest.kt deleted file mode 100644 index 9625a9bb..00000000 --- a/app/src/androidTest/java/com/andro/secure/BouncyIntentTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.andro.secure - -import android.content.Intent -import android.util.Log -import androidx.test.core.app.ActivityScenario.launch -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.assertion.ViewAssertions -import androidx.test.espresso.matcher.ViewMatchers -import androidx.test.espresso.matcher.ViewMatchers.withId -import com.andro.secure.intents.BouncableActivity -import org.junit.Test - -class BouncyIntentTest { - - @Test - fun testThatBouncyIntentsDontAllowAccessToProtectedComponents() { - launch(setupBouncingIntentButton()) - .apply { - onActivity { - Log.v("Activity", "Act") - } - } - - onView(withId(R.id.protectedText)).check(ViewAssertions.doesNotExist()) - onView(withId(R.id.oopsNotWorking)).check(ViewAssertions.matches(ViewMatchers.withText(R.string.oops_couldn_t_bounce))) - } - - private fun setupBouncingIntentButton() = - Intent("com.andro.secure.bouncy").apply { - putExtra("bounce", buildBouncyIntent()) - } - - - private fun buildBouncyIntent() = Intent("com.andro.secure.sensitive-activity") -} \ No newline at end of file diff --git a/app/src/androidTest/java/com/andro/secure/FileVerificationTest.kt b/app/src/androidTest/java/com/andro/secure/FileVerificationTest.kt deleted file mode 100644 index 6bea2ad6..00000000 --- a/app/src/androidTest/java/com/andro/secure/FileVerificationTest.kt +++ /dev/null @@ -1,170 +0,0 @@ -package com.andro.secure - -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.StrictMode -import android.os.StrictMode.VmPolicy -import android.widget.TextView -import androidx.core.content.FileProvider -import androidx.test.core.app.ActivityScenario.launch -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.assertion.ViewAssertions -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.espresso.matcher.ViewMatchers.withText -import com.andro.secure.intents.DisplayFileActivity -import org.junit.Assert.assertNotEquals -import org.junit.Assert.fail -import org.junit.Test -import java.io.File - -class FileVerificationTest { - - @Test - fun testThatRequestForFilesIsDeniedIfTryingToDirectoryTraverse() { - disableDeathOfFileUriExposure() - launch(MainActivity::class.java).apply { - onActivity { - it.createFileWeShouldntFind() - - Thread { - launch( - Intent(Intent.ACTION_SEND).apply { - putExtra( - Intent.EXTRA_STREAM, - Uri.parse("file:///data/data/../data/${it.packageName}/def.txt") - ) - }) - }.start() - } - } - - checkWeCantSeePrivateFile() - } - - @Test - fun testThatRequestForFilesAreRejectedIfInPrivateFolder() { - disableDeathOfFileUriExposure() - launch(MainActivity::class.java).apply { - onActivity { - it.createFileWeShouldntFind() - - launchWithIntent( - Intent(Intent.ACTION_SEND).apply { - putExtra( - Intent.EXTRA_STREAM, - Uri.parse("file:///data/data/${it.packageName}/def.txt") - ) - }) - } - } - - checkWeCantSeePrivateFile() - } - - - @Test - fun testThatRequestForFilesAreAcceptedIfEverythingIsOk() { - getFileAndStartActivity { - File(it.filesDir, "abc.txt").apply { - writeText("Hello world") - } - } - - Thread.sleep(1000) - onView(withId(R.id.testTextView)).check(ViewAssertions.matches(withText("Hello world"))) - } - - @Test - fun testThatCheckIsNotVulnerableToSymlinkAttachs() { - disableDeathOfFileUriExposure() - launch(MainActivity::class.java).apply { - onActivity { - it.createFileWeShouldntFind() - val builder = VmPolicy.Builder() - StrictMode.setVmPolicy(builder.build()) - // Set readable / writable / executable - File(it.filesDir, FILE).setReadable(true, false) - File(it.filesDir, FILE).setWritable(true, false) - File(it.filesDir, FILE).setExecutable(true, false) - - try { - Runtime.getRuntime() - .exec("ln -s /data/data/${it.packageName}/def.txt ${it.filesDir.absolutePath}/$FILE") - .waitFor() - } catch (e: java.lang.Exception) { - e.printStackTrace() - fail() - } - - launchWithIntent( - Intent(Intent.ACTION_SEND).apply { - putExtra( - Intent.EXTRA_STREAM, - Uri.parse("file:///${it.filesDir.absolutePath}/$FILE") - ) - } - ) - } - } - - checkWeCantSeePrivateFile() - } - - - private fun launchWithIntent(intent: Intent) = - Thread { - launch(intent) - }.start() - - - private fun disableDeathOfFileUriExposure() { - if (Build.VERSION.SDK_INT >= 24) { - try { - val m = StrictMode::class.java.getMethod("disableDeathOnFileUriExposure") - m.invoke(null) - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - private fun getFileAndStartActivity(createFile: (Context) -> File) { - launch(MainActivity::class.java).apply { - onActivity { - Thread { - launch( - Intent(Intent.ACTION_SEND).apply { - putExtra( - Intent.EXTRA_STREAM, - FileProvider.getUriForFile( - it, - "com.example.myapp.fileprovider", - createFile(it) - ) - ) - }) - }.start() - } - } - } - - private fun Context.createFileWeShouldntFind() = File(filesDir, "../def.txt").apply { - writeText(SHOULD_NOT_SEE) - } - - private fun checkWeCantSeePrivateFile() { - Thread.sleep(100) - onView(withId(R.id.testTextView)) - .check { view, _ -> - view as TextView - assertNotEquals(SHOULD_NOT_SEE, view.text.toString()) - } - } - - companion object { - const val SHOULD_NOT_SEE = "We should NOT stand for this being visible!" - const val FILE = "file.txt" - } -} diff --git a/app/src/androidTest/java/com/andro/secure/UrlVerificationTest.kt b/app/src/androidTest/java/com/andro/secure/UrlVerificationTest.kt deleted file mode 100644 index 3877d7ae..00000000 --- a/app/src/androidTest/java/com/andro/secure/UrlVerificationTest.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.andro.secure - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import androidx.test.core.app.ActivityScenario.launch -import androidx.test.espresso.Espresso -import androidx.test.espresso.assertion.ViewAssertions -import androidx.test.espresso.matcher.ViewMatchers -import com.andro.secure.intents.WebViewActivity -import junit.framework.TestCase.assertFalse -import org.junit.Test - -class UrlVerificationTest { - - var hacked = false - - @Test - fun testThatUrlVerificationFails() { - val intent = Intent("com.andro.secure.webview") - .apply { putExtra("url", "http://dodgy.website/") } - - launch(intent) - Espresso.onView(ViewMatchers.withId(R.id.errorMessage)) - .check(ViewAssertions.matches(ViewMatchers.withText("Error with URL"))) - } - - @Test - fun testThatBroadcastReceiverDoesNotTrigger() { - - launch(MainActivity::class.java).onActivity { - it.registerReceiver( - MaliciousBroadcastReceiver(), IntentFilter.create( - "com.andro.secure.sensitive-action", - "application/json" - ) - ) - - it.sendBroadcast(Intent("com.andro.secure.sensitive-action")) - } - - assertFalse("Hacked should be false - we should not have triggered this!!", hacked) - } - - inner class MaliciousBroadcastReceiver : BroadcastReceiver() { - override fun onReceive(p0: Context?, p1: Intent?) { - hacked = true - } - - } -} diff --git a/app/src/androidTest/java/com/andro/secure/util/WaitForTextAction.kt b/app/src/androidTest/java/com/andro/secure/util/WaitForTextAction.kt deleted file mode 100644 index 122ef79d..00000000 --- a/app/src/androidTest/java/com/andro/secure/util/WaitForTextAction.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.andro.secure.util - -// CustomViewActions.kt: diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index 6dad4f6c..00000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/assets/evil.html b/app/src/main/assets/evil.html deleted file mode 100644 index c10bc442..00000000 --- a/app/src/main/assets/evil.html +++ /dev/null @@ -1,4 +0,0 @@ - -

Uh ok..

- - diff --git a/app/src/main/assets/index.html b/app/src/main/assets/index.html deleted file mode 100644 index dfd850e9..00000000 --- a/app/src/main/assets/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - -

-

- -

-

- - - - - diff --git a/app/src/main/java/com/andro/secure/MainActivity.kt b/app/src/main/java/com/andro/secure/MainActivity.kt deleted file mode 100644 index 5445d6db..00000000 --- a/app/src/main/java/com/andro/secure/MainActivity.kt +++ /dev/null @@ -1,94 +0,0 @@ -package com.andro.secure - -import android.content.Context -import android.os.Bundle -import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuItem -import androidx.appcompat.app.AppCompatActivity -import androidx.navigation.findNavController -import com.andro.secure.databinding.ActivityMainBinding -import com.safetorun.features.blacklistedapps.blacklistedAppCheck -import com.safetorun.features.installorigin.installOriginCheckWithDefaultsCheck -import com.safetorun.features.oscheck.bannedBoardCheck -import com.safetorun.features.oscheck.bannedHardwareCheck -import com.safetorun.features.oscheck.emulator.banAvdEmulatorCheck -import com.safetorun.features.oscheck.emulator.banBluestacksEmulatorCheck -import com.safetorun.features.oscheck.emulator.banGenymotionEmulatorCheck -import com.safetorun.features.oscheck.safeToRunCombinedCheck -import com.safetorun.features.rootdetection.rootDetectionCheck -import com.safetorun.inline.initialiseSafeToRunPlus -import com.safetorun.inline.logger -import com.safetorun.inline.safeToRunWithLogger -import com.safetorun.intents.file.verifyFile -import java.io.File - - -class MainActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - initialiseSafeToRunPlus("CEnQEwYzpV8O05Q5x8lGe5rijnvqcxAk4EuTD3bW") - - val binding = ActivityMainBinding.inflate(LayoutInflater.from(this)) - setContentView(binding.root) - - canIRun("MainActivityCheck") { - throw RuntimeException("Failed to start activity!") - } - } - - private inline fun Context.canIRun(checkName: String, actionOnFailure: () -> Unit) { - -// if (safeToRunWithLogger( -// logger = logger(checkName), -// { banAvdEmulatorCheck() }, -// { banGenymotionEmulatorCheck() }, -// { banBluestacksEmulatorCheck() }, -// { blacklistedAppCheck("Test app", "Test app 2") }, -// { rootDetectionCheck() }, -// { -// safeToRunCombinedCheck( -// listOf( -// { bannedHardwareCheck("hardware") }, -// { bannedBoardCheck("board") } -// ) -// ) -// }, -// { -// safeToRunCombinedCheck( -// listOf { installOriginCheckWithDefaultsCheck() }, -// listOf { !BuildConfig.DEBUG } -// ) -// }, -// )() -// ) { -// actionOnFailure() -// } - } - - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - // Inflate the menu; this adds items to the action bar if it is present. - menuInflater.inflate(R.menu.main_menu, menu) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == R.id.webView) { - findNavController(R.id.nav_host_fragment).navigate(R.id.action_reportFragment_to_webViewSample) - } - - return super.onOptionsItemSelected(item) - } - - fun verify(fullFilenameToVerify: String) { - - // Full name to verify = /ok/to/downloadto/../../filename.txt - reject! - File(fullFilenameToVerify).verifyFile(this) { - File("/ok/to/downloadto").allowDirectory(allowSubdirectories = false) - } - - - } -} diff --git a/app/src/main/java/com/andro/secure/ProtectedActivity.kt b/app/src/main/java/com/andro/secure/ProtectedActivity.kt deleted file mode 100644 index 92447d49..00000000 --- a/app/src/main/java/com/andro/secure/ProtectedActivity.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.andro.secure - -import android.os.Bundle -import android.view.LayoutInflater -import androidx.appcompat.app.AppCompatActivity -import com.andro.secure.databinding.ProtectedActivityBinding - -class ProtectedActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(ProtectedActivityBinding.inflate(LayoutInflater.from(this)).root) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/andro/secure/intents/BouncableActivity.kt b/app/src/main/java/com/andro/secure/intents/BouncableActivity.kt deleted file mode 100644 index 352d693c..00000000 --- a/app/src/main/java/com/andro/secure/intents/BouncableActivity.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.andro.secure.intents - -import android.app.Activity -import android.content.Intent -import android.os.Bundle -import android.view.LayoutInflater -import com.andro.secure.R -import com.andro.secure.databinding.ActivityBouncableBinding -import com.safetorun.intents.verify - -class BouncableActivity : Activity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - val layout = ActivityBouncableBinding.inflate(LayoutInflater.from(this)).apply { - setContentView(root) - } - - intent.verify(this) { - allowAnyFile = false - - - andThen { passed, _ -> - if (passed) { - startActivity(intent.extras?.get("bounce") as Intent) - } else { - layout.oopsNotWorking.text = getString(R.string.oops_couldn_t_bounce) - - } - } - } - } -} diff --git a/app/src/main/java/com/andro/secure/intents/DisplayFileActivity.kt b/app/src/main/java/com/andro/secure/intents/DisplayFileActivity.kt deleted file mode 100644 index 02367611..00000000 --- a/app/src/main/java/com/andro/secure/intents/DisplayFileActivity.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.andro.secure.intents - -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.Bundle -import android.os.Parcelable -import android.widget.TextView -import androidx.annotation.RequiresApi -import androidx.appcompat.app.AppCompatActivity -import com.andro.secure.R -import com.safetorun.intents.file.verifyFile -import java.nio.charset.Charset - -class DisplayFileActivity : AppCompatActivity() { - - @RequiresApi(Build.VERSION_CODES.Q) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - setContentView(R.layout.display_file_activity) - - findViewById(R.id.testTextView).apply { - (when { - intent.data != null -> { - intent.data - } - intent.action == Intent.ACTION_SEND -> { - intent.getParcelableExtra(Intent.EXTRA_STREAM) as Uri - } - intent.action == Intent.ACTION_SEND_MULTIPLE -> { - intent.getParcelableArrayExtra(Intent.EXTRA_STREAM)?.first() as Uri - } - else -> { - throw IllegalArgumentException() - } - })?.let { - val fileCheckResult = it.verifyFile(this@DisplayFileActivity) { - context.filesDir.allowDirectory() - } - - if (fileCheckResult) { - text = - contentResolver.openInputStream(it) - ?.readBytes() - ?.toString(Charset.defaultCharset()) - } - } - } - } -} diff --git a/app/src/main/java/com/andro/secure/intents/SensitiveBroadcastReceiver.kt b/app/src/main/java/com/andro/secure/intents/SensitiveBroadcastReceiver.kt deleted file mode 100644 index 2fd67f50..00000000 --- a/app/src/main/java/com/andro/secure/intents/SensitiveBroadcastReceiver.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.andro.secure.intents - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import com.andro.secure.util.logVerbose - -class SensitiveBroadcastReceiver : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - logVerbose(intent.toString()) - logVerbose("Performing sensitive action!!!!!!!") - } -} diff --git a/app/src/main/java/com/andro/secure/intents/WebViewActivity.kt b/app/src/main/java/com/andro/secure/intents/WebViewActivity.kt deleted file mode 100644 index f60b19a7..00000000 --- a/app/src/main/java/com/andro/secure/intents/WebViewActivity.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.andro.secure.intents - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import androidx.appcompat.app.AppCompatActivity -import com.andro.secure.databinding.ActivityWebViewBinding -import com.safetorun.intents.url.params.AllowedType -import com.safetorun.intents.url.urlVerification -import com.safetorun.intents.verify - -class WebViewActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - // Can do this specifically with the web verification tool - - val url = intent?.extras?.getString("url") - val isUrlOk = url?.urlVerification { - "safetorun.com".allowHost() - allowParameter { - allowedType = AllowedType.String - parameterName = "a_token" - } - } - - if (isUrlOk != true) { - // Do something - Log.v("WebViewActivity", "Do something") - } - - ActivityWebViewBinding.inflate(LayoutInflater.from(this)).apply { - setContentView(root) - - // Or do it with intent verification - - val result = intent.verify(baseContext) { - - urlConfig { - "safetorun.com".allowHost() - allowParameter { - allowedType = AllowedType.String - parameterName = "a_token" - } - } - - actionOnSuccess = { - errorMessage.visibility = View.GONE - intent?.extras?.getString("url") - ?.let { "${it}?sensitive_token=pleasekeepmesecret" } - ?.let(webView::loadUrl) - } - } - - if (result.not()) { - errorMessage.visibility = View.VISIBLE - errorMessage.text = "Error with URL" - } - } - } -} diff --git a/app/src/main/java/com/andro/secure/package-info.java b/app/src/main/java/com/andro/secure/package-info.java deleted file mode 100644 index 5f741760..00000000 --- a/app/src/main/java/com/andro/secure/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.andro.secure; - -import com.airbnb.epoxy.EpoxyDataBindingLayouts; - -@EpoxyDataBindingLayouts({R.layout.simple_list_item}) -interface EpoxyDataBindingConfig { -} diff --git a/app/src/main/java/com/andro/secure/report/ReportFragment.kt b/app/src/main/java/com/andro/secure/report/ReportFragment.kt deleted file mode 100644 index 00715455..00000000 --- a/app/src/main/java/com/andro/secure/report/ReportFragment.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.andro.secure.report - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.ViewGroup -import android.widget.Toast -import androidx.fragment.app.Fragment -import com.andro.secure.BuildConfig -import com.andro.secure.ProtectedActivity -import com.andro.secure.databinding.ReportFragmentBinding -import com.auth0.jwt.interfaces.DecodedJWT -import com.safetorun.features.blacklistedapps.blacklistedAppCheck -import com.safetorun.features.debug.isDebuggableCheck -import com.safetorun.features.installorigin.installOriginCheckWithDefaultsCheck -import com.safetorun.features.oscheck.bannedBoardCheck -import com.safetorun.features.oscheck.bannedHardwareCheck -import com.safetorun.features.oscheck.emulator.banAvdEmulatorCheck -import com.safetorun.features.oscheck.emulator.banBluestacksEmulatorCheck -import com.safetorun.features.oscheck.emulator.banGenymotionEmulatorCheck -import com.safetorun.features.oscheck.safeToRunCombinedCheck -import com.safetorun.features.rootdetection.rootDetectionCheck -import com.safetorun.features.signatureverify.verifySignatureCheck -import com.safetorun.inline.safeToRunWithLogger -import com.safetorun.logger.loggerForCheck -import java.util.Date - -class ReportFragment : Fragment() { - - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = - ReportFragmentBinding.inflate(inflater, container, false) - .apply { setup(this) } - .root - - private fun setup(binding: ReportFragmentBinding) { - binding.runSensitiveAction.setOnClickListener { - requireContext().canIRun("ReportFragmentCheck") { - throw RuntimeException("Def") - } - - Toast.makeText(it.context, "Performed sensitive action!!", Toast.LENGTH_LONG) - .show() - } - - binding.startProtectedActivity.setOnClickListener { - startActivity(Intent(requireContext(), ProtectedActivity::class.java)) - } - - requireContext().canIRun("ReportFragmentCheck") { Log.v("Failure", "Failure") } - - } - - private fun DecodedJWT.verifierResult(): Map = - mapOf( - "correctIssuer" to (issuer == BuildConfig.API_KEY), - "anyFailures" to ((claims[Errors]?.asInt() ?: 1) > 0), - "expired" to expiresAt.after(Date()), - "anyWarnings" to ((claims[Warnings]?.asInt() ?: 1) > 0), - "anyPasses" to ((claims[Passes]?.asInt() ?: 1) > 0) - ).mapValues { it.value.toString() } - - - private inline fun Context.canIRun(checkName: String, actionOnFailure: () -> Unit) { -// if (safeToRunWithLogger( -// logger = loggerForCheck(checkName), -// { verifySignatureCheck() }, -// { banAvdEmulatorCheck() }, -// { banGenymotionEmulatorCheck() }, -// { banBluestacksEmulatorCheck() }, -// { blacklistedAppCheck("Test app", "Test app 2") }, -// { rootDetectionCheck() }, -// { isDebuggableCheck() }, -// { -// safeToRunCombinedCheck( -// listOf( -// { bannedHardwareCheck("hardware") }, -// { bannedBoardCheck("board") } -// ) -// ) -// }, -// { -// safeToRunCombinedCheck( -// listOf { installOriginCheckWithDefaultsCheck() }, -// listOf { !BuildConfig.DEBUG } -// ) -// }, -// { verifySignatureCheck("Abc") } -// )() -// ) { -// actionOnFailure() -// } - } - - companion object { - const val MIN_OS_VERSION = 41 - const val Warnings = "warnings" - const val Errors = "errors" - const val Passes = "passes" - } -} diff --git a/app/src/main/java/com/andro/secure/util/Log.kt b/app/src/main/java/com/andro/secure/util/Log.kt deleted file mode 100644 index 88799744..00000000 --- a/app/src/main/java/com/andro/secure/util/Log.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.andro.secure.util - -import android.util.Log - -fun Any.logVerbose(message: String) = Log.v(this::class.java.toString(), message) diff --git a/app/src/main/java/com/andro/secure/webview/WebViewSample.kt b/app/src/main/java/com/andro/secure/webview/WebViewSample.kt deleted file mode 100644 index 7b8343a2..00000000 --- a/app/src/main/java/com/andro/secure/webview/WebViewSample.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.andro.secure.webview - -import android.annotation.SuppressLint -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import android.webkit.JavascriptInterface -import android.webkit.WebResourceRequest -import android.webkit.WebView -import android.webkit.WebViewClient -import androidx.fragment.app.Fragment -import com.andro.secure.databinding.WebViewFragmentBinding -import com.andro.secure.util.logVerbose -import com.safetorun.inline.verifyLogger -import com.safetorun.intents.url.verify -import com.safetorun.logger.withLogger - -class WebViewSample : Fragment() { - - @SuppressLint("SetJavaScriptEnabled") - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ) = - WebViewFragmentBinding.inflate(inflater, container, false) - .apply { - webViewSample.webViewClient = WebViewClientSample() - webViewSample.settings.javaScriptEnabled = true - webViewSample.addJavascriptInterface(this@WebViewSample, "app") - } - .apply { webViewSample.loadUrl("file:///android_asset/index.html") } - .root - - @JavascriptInterface - fun executeFunction() { - logVerbose("Executed function. Imagine this was sensitive..") - } - - class WebViewClientSample : WebViewClient() { - override fun shouldOverrideUrlLoading( - view: WebView?, - request: WebResourceRequest? - ): Boolean { - - val result = request!!.url?.toString()?.verify { - withLogger( - true, - view!!.context.verifyLogger( - "WebViewSample" - ) - ) - "file:///android_asset/index.html".allowUrl() - } ?: false - - - return if (result) { - super.shouldOverrideUrlLoading(view, request) - } else { - true - } - } - } -} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d11..00000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/check.png b/app/src/main/res/drawable/check.png deleted file mode 100644 index 366e4b9da5f259ad0c1c261c91b11ec3bf9247c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17898 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�JoZ}b3fg!i_z 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 diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9c..00000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/warning.png b/app/src/main/res/drawable/warning.png deleted file mode 100644 index 9c155223c738d623349fccaca93ad85d9e6ff487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21799 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 MY-EWkzvvS8Us=nq-~a#s diff --git a/app/src/main/res/layout/activity_bouncable.xml b/app/src/main/res/layout/activity_bouncable.xml deleted file mode 100644 index ce7bb3fb..00000000 --- a/app/src/main/res/layout/activity_bouncable.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 5666dc97..00000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/activity_web_view.xml b/app/src/main/res/layout/activity_web_view.xml deleted file mode 100644 index e18436b6..00000000 --- a/app/src/main/res/layout/activity_web_view.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/display_file_activity.xml b/app/src/main/res/layout/display_file_activity.xml deleted file mode 100644 index 6aef8d0c..00000000 --- a/app/src/main/res/layout/display_file_activity.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/app/src/main/res/layout/protected_activity.xml b/app/src/main/res/layout/protected_activity.xml deleted file mode 100644 index 457ae54d..00000000 --- a/app/src/main/res/layout/protected_activity.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/report_fragment.xml b/app/src/main/res/layout/report_fragment.xml deleted file mode 100644 index 91a1b6e4..00000000 --- a/app/src/main/res/layout/report_fragment.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - -