From 5f99154690426a199a28e8b4e222a76e76d36d4f Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 8 Mar 2023 11:10:10 +0100 Subject: [PATCH] remove apple auth for now --- Habitica/build.gradle | 2 - .../habitica/helpers/SignInWebViewClient.kt | 67 ----------- .../helpers/SignInWebViewDialogFragment.kt | 105 ------------------ .../helpers/SignInWithAppleService.kt | 89 --------------- .../habitica/ui/activities/LoginActivity.kt | 5 - .../preferences/AccountPreferenceFragment.kt | 9 -- .../ui/viewmodels/AuthenticationViewModel.kt | 29 ----- 7 files changed, 306 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 1b07c5fdb..5d1b0ad38 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -121,8 +121,6 @@ dependencies { implementation "androidx.compose.ui:ui-tooling:$compose_version" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" - implementation 'com.willowtreeapps:signinwithapplebutton:0.3' - implementation project(':common') implementation project(':shared') diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt deleted file mode 100644 index 506d0beff..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewClient.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.habitrpg.android.habitica.helpers - -import android.net.Uri -import android.os.Build -import android.util.Log -import android.webkit.WebResourceRequest -import android.webkit.WebResourceResponse -import android.webkit.WebView -import android.webkit.WebViewClient -import androidx.annotation.RequiresApi -import com.habitrpg.android.habitica.BuildConfig - -class SignInWebViewClient( - private val attempt: SignInWithAppleService.AuthenticationAttempt, - private val callback: (SignInWithAppleResult) -> Unit -) : WebViewClient() { - - // for API levels < 24 - override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { - return isUrlOverridden(view, Uri.parse(url)) - } - - @RequiresApi(Build.VERSION_CODES.N) - override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { - return isUrlOverridden(view, request?.url) - } - - override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? { - request?.requestHeaders?.let { it["Authorization"] = "Basic " + BuildConfig.STAGING_KEY } - return super.shouldInterceptRequest(view, request) - } - - private fun isUrlOverridden(view: WebView?, url: Uri?): Boolean { - return when { - url == null -> { - false - } - url.toString().contains("appleid.apple.com") -> { - view?.loadUrl(url.toString()) - true - } - (url.toString().contains(attempt.redirectUri) || url.toString().contains("userID")) -> { - Log.d("Apple Sign in", "Web view was forwarded to redirect URI") - - val userID = url.getQueryParameter("userID") - val apiKey = url.getQueryParameter("key") - - if (userID == null || apiKey == null) { - callback(SignInWithAppleResult.Failure(IllegalArgumentException("data not returned"))) - } else { - callback(SignInWithAppleResult.Success(userID, apiKey, url.getQueryParameter("newUser") == "true")) - } - - true - } - else -> { - false - } - } - } -} - -sealed class SignInWithAppleResult { - data class Success(val userID: String, val apiKey: String, val newUser: Boolean) : SignInWithAppleResult() - data class Failure(val error: Throwable) : SignInWithAppleResult() - object Cancel : SignInWithAppleResult() -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt deleted file mode 100644 index cc45e6787..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWebViewDialogFragment.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.habitrpg.android.habitica.helpers - -import android.content.DialogInterface -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.webkit.WebView -import androidx.fragment.app.DialogFragment -import com.habitrpg.android.habitica.R - -class SignInWebViewDialogFragment : DialogFragment() { - - companion object { - private const val AUTHENTICATION_ATTEMPT_KEY = "authenticationAttempt" - private const val WEB_VIEW_KEY = "webView" - - fun newInstance(authenticationAttempt: SignInWithAppleService.AuthenticationAttempt): SignInWebViewDialogFragment { - val fragment = SignInWebViewDialogFragment() - fragment.arguments = Bundle().apply { - putParcelable(AUTHENTICATION_ATTEMPT_KEY, authenticationAttempt) - } - return fragment - } - } - - private lateinit var authenticationAttempt: SignInWithAppleService.AuthenticationAttempt - private var callback: ((SignInWithAppleResult) -> Unit)? = null - - private val webViewIfCreated: WebView? - get() = view as? WebView - - fun configure(callback: (SignInWithAppleResult) -> Unit) { - this.callback = callback - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - authenticationAttempt = arguments?.getParcelable(AUTHENTICATION_ATTEMPT_KEY)!! - setStyle(STYLE_NORMAL, R.style.sign_in_with_apple_button_DialogTheme) - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - super.onCreateView(inflater, container, savedInstanceState) - - val webView = context?.let { - WebView(it).apply { - settings.apply { - javaScriptEnabled = true - javaScriptCanOpenWindowsAutomatically = true - } - } - } - - webView?.webViewClient = SignInWebViewClient(authenticationAttempt, ::onCallback) - - if (savedInstanceState != null) { - savedInstanceState.getBundle(WEB_VIEW_KEY)?.run { - webView?.restoreState(this) - } - } else { - webView?.loadUrl(authenticationAttempt.authenticationUri) - } - - return webView - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putBundle( - WEB_VIEW_KEY, - Bundle().apply { - webViewIfCreated?.saveState(this) - } - ) - } - - override fun onStart() { - super.onStart() - - dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) - } - - override fun onCancel(dialog: DialogInterface) { - super.onCancel(dialog) - onCallback(SignInWithAppleResult.Cancel) - } - - // SignInWithAppleCallback - - private fun onCallback(result: SignInWithAppleResult) { - dialog?.dismiss() - val callback = callback - if (callback == null) { - Log.e("Apple Sign in", "Callback is not configured") - return - } - callback(result) - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt deleted file mode 100644 index fbf0ed11e..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SignInWithAppleService.kt +++ /dev/null @@ -1,89 +0,0 @@ -package com.habitrpg.android.habitica.helpers - -import android.net.Uri -import android.os.Parcel -import android.os.Parcelable -import androidx.fragment.app.FragmentManager -import com.willowtreeapps.signinwithapplebutton.SignInWithAppleConfiguration -import java.util.UUID - -class SignInWithAppleService( - private val fragmentManager: FragmentManager, - private val fragmentTag: String, - private val configuration: SignInWithAppleConfiguration, - private val callback: (SignInWithAppleResult) -> Unit -) { - - init { - val fragmentIfShown = - fragmentManager.findFragmentByTag(fragmentTag) as? SignInWebViewDialogFragment - fragmentIfShown?.configure(callback) - } - - data class AuthenticationAttempt( - val authenticationUri: String, - val redirectUri: String, - val state: String - ) : Parcelable { - constructor(parcel: Parcel) : this( - parcel.readString() ?: "invalid", - parcel.readString() ?: "invalid", - parcel.readString() ?: "invalid" - ) - - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeString(authenticationUri) - parcel.writeString(redirectUri) - parcel.writeString(state) - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - - override fun createFromParcel(parcel: Parcel) = AuthenticationAttempt(parcel) - - override fun newArray(size: Int): Array = arrayOfNulls(size) - - /* - The authentication page URI we're creating is based off the URI constructed by Apple's JavaScript SDK, - which is why certain fields (like the version, v) are included in the URI construction. - - We have to build this URI ourselves because Apple's behavior in JavaScript is to POST the response, - while we need a GET so we can retrieve the authentication code and verify the state - merely by intercepting the URL. - - See the Sign In With Apple Javascript SDK for comparison: - https://developer.apple.com/documentation/signinwithapplejs/configuring_your_webpage_for_sign_in_with_apple - */ - fun create( - configuration: SignInWithAppleConfiguration, - state: String = UUID.randomUUID().toString() - ): AuthenticationAttempt { - val authenticationUri = Uri - .parse("https://appleid.apple.com/auth/authorize") - .buildUpon().apply { - appendQueryParameter("response_type", "code") - appendQueryParameter("v", "1.1.6") - appendQueryParameter("client_id", configuration.clientId) - appendQueryParameter("redirect_uri", configuration.redirectUri) - appendQueryParameter("scope", configuration.scope) - appendQueryParameter("state", state) - appendQueryParameter("response_mode", "form_post") - } - .build() - .toString() - - return AuthenticationAttempt(authenticationUri, configuration.redirectUri, state) - } - } - } - - fun show() { - val fragment = SignInWebViewDialogFragment.newInstance(AuthenticationAttempt.create(configuration)) - fragment.configure(callback) - fragment.show(fragmentManager, fragmentTag) - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt index eb2f2816b..70b09be29 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt @@ -170,11 +170,6 @@ class LoginActivity : BaseActivity() { binding.backButton.setOnClickListener { backButtonClicked() } binding.forgotPassword.setOnClickListener { onForgotPasswordClicked() } binding.googleLoginButton.setOnClickListener { viewModel.handleGoogleLogin(this, pickAccountResult) } - binding.appleLoginButton.setOnClickListener { - viewModel.connectApple(supportFragmentManager) { - handleAuthResponse(it) - } - } } override fun loadTheme(sharedPreferences: SharedPreferences, forced: Boolean) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt index 3fbeeb6e6..25c642ba9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt @@ -177,15 +177,6 @@ class AccountPreferenceFragment : } } } - "apple_auth" -> { - if (user?.authentication?.hasAppleAuth == true) { - disconnect("apple", "Apple") - } else { - viewModel.connectApple(parentFragmentManager) { - viewModel.handleAuthResponse(it) - } - } - } "facebook_auth" -> { if (user?.authentication?.hasFacebookAuth == true) { disconnect("facebook", "Facebook") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt index 12a1e2693..7adc78f79 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt @@ -8,7 +8,6 @@ import android.content.SharedPreferences import android.os.Build import androidx.activity.result.ActivityResultLauncher import androidx.core.content.edit -import androidx.fragment.app.FragmentManager import com.google.android.gms.auth.GoogleAuthException import com.google.android.gms.auth.GoogleAuthUtil import com.google.android.gms.auth.GooglePlayServicesAvailabilityException @@ -17,20 +16,16 @@ import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.common.GooglePlayServicesUtil import com.google.android.gms.common.Scopes -import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.extensions.addCloseButton -import com.habitrpg.android.habitica.helpers.SignInWithAppleResult -import com.habitrpg.android.habitica.helpers.SignInWithAppleService import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.common.habitica.api.HostConfig import com.habitrpg.common.habitica.helpers.AnalyticsManager import com.habitrpg.common.habitica.helpers.KeyHelper import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.models.auth.UserAuthResponse -import com.willowtreeapps.signinwithapplebutton.SignInWithAppleConfiguration import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import javax.inject.Inject @@ -45,30 +40,6 @@ class AuthenticationViewModel @Inject constructor( ) { var googleEmail : String? = null - fun connectApple(fragmentManager : FragmentManager, onSuccess : (UserAuthResponse) -> Unit) { - val configuration = SignInWithAppleConfiguration( - clientId = BuildConfig.APPLE_AUTH_CLIENT_ID, - redirectUri = "${hostConfig.address}/api/v4/user/auth/apple", - scope = "name email" - ) - val fragmentTag = "SignInWithAppleButton-SignInWebViewDialogFragment" - - SignInWithAppleService(fragmentManager, fragmentTag, configuration) { result -> - when (result) { - is SignInWithAppleResult.Success -> { - val response = UserAuthResponse() - response.id = result.userID - response.apiToken = result.apiKey - response.newUser = result.newUser - onSuccess(response) - } - - else -> { - } - } - }.show() - } - fun handleGoogleLogin( activity : Activity, pickAccountResult : ActivityResultLauncher