Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a163d3cc authored by Jonathan Klee's avatar Jonathan Klee
Browse files

feat(auth): use e browser only when installed

parent 3008edbf
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -286,6 +286,7 @@

        <!-- ICSx5 for Webcal feeds -->
        <package android:name="at.bitfire.icsdroid"/>
        <package android:name="foundation.e.browser" />

        <!-- apps that interact with contact, calendar, task data (for debug info) -->
        <intent>
+30 −5
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@
package at.bitfire.davdroid.di

import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import at.bitfire.davdroid.ProductIds
import dagger.Module
import dagger.Provides
@@ -13,6 +15,8 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import net.openid.appauth.AppAuthConfiguration
import net.openid.appauth.AuthorizationService
import net.openid.appauth.browser.AnyBrowserMatcher
import net.openid.appauth.browser.BrowserMatcher
import java.net.HttpURLConnection
import java.net.URL

@@ -22,7 +26,7 @@ import java.net.URL
@Module
@InstallIn(SingletonComponent::class)
class AuthorizationServiceModule {
    val defaultBrowser = "foundation.e.browser"
    private val defaultBrowser = "foundation.e.browser"

    /**
     * Make sure to call [net.openid.appauth.AuthorizationService.dispose] when obtaining an instance.
@@ -38,9 +42,7 @@ class AuthorizationServiceModule {
        AuthorizationService(
            context,
            AppAuthConfiguration.Builder()
                .setBrowserMatcher {
                    it.packageName == defaultBrowser
                }
                .setBrowserMatcher(getBrowserMatcher(context))
                .setConnectionBuilder { uri ->
                    val url = URL(uri.toString())
                    (url.openConnection() as HttpURLConnection).apply {
@@ -49,4 +51,27 @@ class AuthorizationServiceModule {
                }.build()
        )

    private fun getBrowserMatcher(context: Context): BrowserMatcher =
        if (isInstalled(context, defaultBrowser)) {
            BrowserMatcher { browser ->
                browser.packageName == defaultBrowser
            }
        } else {
            AnyBrowserMatcher.INSTANCE
        }

    private fun isInstalled(context: Context, packageName: String): Boolean {
        return try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                context.packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0))
            } else {
                @Suppress("DEPRECATION")
                context.packageManager.getPackageInfo(packageName, 0)
            }
            true
        } catch (_: PackageManager.NameNotFoundException) {
            false
        }
    }

}