From a4fd7d4fd89a8dcb60bd890275a3cf51a3566863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Fri, 20 Jan 2023 20:11:01 +0100 Subject: [PATCH] Set Wear OAuth redirect URI automatically and catch exceptions (#3244) - Allow the Wear support libraries to specify the redirect URI to use for OAuth login - Catch any exceptions that might be thrown when building an OAuth request --- .../AuthenticationRepository.kt | 2 +- .../impl/AuthenticationRepositoryImpl.kt | 3 +-- .../onboarding/OnboardingPresenterImpl.kt | 23 ++++++++++--------- .../manual_setup/ManualSetupPresenterImpl.kt | 23 ++++++++++--------- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/AuthenticationRepository.kt b/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/AuthenticationRepository.kt index d855b143c..28636fbc0 100644 --- a/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/AuthenticationRepository.kt +++ b/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/AuthenticationRepository.kt @@ -13,7 +13,7 @@ interface AuthenticationRepository { suspend fun getSessionState(): SessionState - suspend fun buildAuthenticationUrl(baseUrl: String, callbackUrl: String): String + suspend fun buildAuthenticationUrl(baseUrl: String): String suspend fun buildBearerToken(): String diff --git a/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/impl/AuthenticationRepositoryImpl.kt b/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/impl/AuthenticationRepositoryImpl.kt index 13bbaf7c8..3cc90b585 100644 --- a/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/impl/AuthenticationRepositoryImpl.kt +++ b/common/src/main/java/io/homeassistant/companion/android/common/data/authentication/impl/AuthenticationRepositoryImpl.kt @@ -89,13 +89,12 @@ class AuthenticationRepositoryImpl @Inject constructor( } } - override suspend fun buildAuthenticationUrl(baseUrl: String, callbackUrl: String): String { + override suspend fun buildAuthenticationUrl(baseUrl: String): String { return baseUrl.toHttpUrlOrNull()!! .newBuilder() .addPathSegments("auth/authorize") .addEncodedQueryParameter("response_type", "code") .addEncodedQueryParameter("client_id", AuthenticationService.CLIENT_ID) - .addEncodedQueryParameter("redirect_uri", callbackUrl) .build() .toString() } diff --git a/wear/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingPresenterImpl.kt b/wear/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingPresenterImpl.kt index 72b388285..cde4ddc72 100644 --- a/wear/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingPresenterImpl.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingPresenterImpl.kt @@ -13,7 +13,6 @@ import com.google.android.gms.wearable.DataEventBuffer import com.google.android.gms.wearable.DataMap import com.google.android.gms.wearable.DataMapItem import dagger.hilt.android.qualifiers.ActivityContext -import io.homeassistant.companion.android.BuildConfig import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository import io.homeassistant.companion.android.common.data.url.UrlRepository import kotlinx.coroutines.CoroutineScope @@ -47,17 +46,19 @@ class OnboardingPresenterImpl @Inject constructor( // ManualSetupPresenterImpl. Also a good starting point for manual URL if it is possible to // enter this on the device without the app in the future. mainScope.launch { - val request = OAuthRequest.Builder(context) - .setAuthProviderUrl( - Uri.parse( - authenticationUseCase.buildAuthenticationUrl( - url, - OAuthRequest.WEAR_REDIRECT_URL_PREFIX + BuildConfig.APPLICATION_ID - ) + val request: OAuthRequest + try { + request = OAuthRequest.Builder(context) + .setAuthProviderUrl( + Uri.parse(authenticationUseCase.buildAuthenticationUrl(url)) ) - ) - .setCodeChallenge(CodeChallenge(codeVerifier)) - .build() + .setCodeChallenge(CodeChallenge(codeVerifier)) + .build() + } catch (e: Exception) { + Log.e(TAG, "Unable to build OAuthRequest", e) + view.showError(commonR.string.failed_unsupported) + return@launch + } authClient = RemoteAuthClient.create(context) authClient?.let { diff --git a/wear/src/main/java/io/homeassistant/companion/android/onboarding/manual_setup/ManualSetupPresenterImpl.kt b/wear/src/main/java/io/homeassistant/companion/android/onboarding/manual_setup/ManualSetupPresenterImpl.kt index 37b596067..4eaa6b379 100644 --- a/wear/src/main/java/io/homeassistant/companion/android/onboarding/manual_setup/ManualSetupPresenterImpl.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/onboarding/manual_setup/ManualSetupPresenterImpl.kt @@ -9,7 +9,6 @@ import androidx.wear.phone.interactions.authentication.OAuthRequest import androidx.wear.phone.interactions.authentication.OAuthResponse import androidx.wear.phone.interactions.authentication.RemoteAuthClient import dagger.hilt.android.qualifiers.ActivityContext -import io.homeassistant.companion.android.BuildConfig import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository import io.homeassistant.companion.android.common.data.url.UrlRepository import kotlinx.coroutines.CoroutineScope @@ -39,17 +38,19 @@ class ManualSetupPresenterImpl @Inject constructor( override fun onNextClicked(context: Context, url: String) { view.showLoading() mainScope.launch { - val request = OAuthRequest.Builder(context) - .setAuthProviderUrl( - Uri.parse( - authenticationUseCase.buildAuthenticationUrl( - url, - OAuthRequest.WEAR_REDIRECT_URL_PREFIX + BuildConfig.APPLICATION_ID - ) + val request: OAuthRequest + try { + request = OAuthRequest.Builder(context) + .setAuthProviderUrl( + Uri.parse(authenticationUseCase.buildAuthenticationUrl(url)) ) - ) - .setCodeChallenge(CodeChallenge(codeVerifier)) - .build() + .setCodeChallenge(CodeChallenge(codeVerifier)) + .build() + } catch (e: Exception) { + Log.e(TAG, "Unable to build OAuthRequest", e) + view.showError(commonR.string.failed_unsupported) + return@launch + } authClient = RemoteAuthClient.create(context) authClient?.let {