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

Commit c1e1fc6f authored by Nihar Thakkar's avatar Nihar Thakkar
Browse files

Handle exceptions during login.

parent 56659c64
Loading
Loading
Loading
Loading
+69 −24
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@ import at.bitfire.dav4android.Constants
import at.bitfire.davdroid.authorization.IdentityProvider

import at.bitfire.davdroid.R
import kotlinx.android.synthetic.main.fragment_google_authenticator.*
import kotlinx.android.synthetic.main.login_credentials_fragment.view.*
import net.openid.appauth.*
import org.json.JSONException
@@ -28,6 +27,8 @@ import java.io.InputStreamReader
import java.net.*
import java.util.HashMap
import java.util.logging.Level
import android.net.ConnectivityManager
import android.widget.Toast


class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenResponseCallback {
@@ -41,10 +42,21 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
    private val bufferSize = 1024
    private var userInfoJson: JSONObject? = null

    private fun isNetworkAvailable(): Boolean {
        val connectivityManager = activity!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val activeNetworkInfo = connectivityManager.activeNetworkInfo
        return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_google_authenticator, container, false)

        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }

        // Initialise the authorization service
        authorizationService = AuthorizationService(context!!)

@@ -60,7 +72,8 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
                            makeAuthRequest(serviceConfiguration, idp)
                        }
                        else {
                            // TODO Handle error
                            Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show()
                            activity!!.finish()
                        }
                    }

@@ -71,7 +84,6 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
                }
            }
            else {
                if (authState == null) {
                val response = AuthorizationResponse.fromIntent(activity!!.intent)
                val ex = AuthorizationException.fromIntent(activity!!.intent)
                authState = AuthState(response, ex)
@@ -80,8 +92,8 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
                    exchangeAuthorizationCode(response)
                }
                else {
                        // TODO Handle error
                    }
                    Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show()
                    activity!!.finish()
                }
            }
        }
@@ -92,6 +104,10 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
    private fun makeAuthRequest(
            serviceConfig: AuthorizationServiceConfiguration,
            idp: IdentityProvider) {
        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }

        val authRequest = AuthorizationRequest.Builder(
                serviceConfig,
@@ -137,6 +153,11 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
    }

    private fun exchangeAuthorizationCode(authorizationResponse: AuthorizationResponse) {
        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }

        val additionalParams = HashMap<String, String?>()
        if (getClientSecretFromIntent(activity!!.intent) != null) {
            additionalParams["client_secret"] = getClientSecretFromIntent(activity!!.intent)
@@ -153,6 +174,11 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon


    private fun performTokenRequest(request: TokenRequest) {
        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }

        authorizationService?.performTokenRequest(
                request, this)
    }
@@ -164,17 +190,26 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
    }

    private fun getAccountInfo() {
        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }

        val discoveryDoc = getDiscoveryDocFromIntent(activity!!.intent)

        if (!authState!!.isAuthorized
                || discoveryDoc == null
                || discoveryDoc.userinfoEndpoint == null) {
            //TODO Error occurred
            Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }
        else {
            object : AsyncTask<Void, Void, Void>() {
                override fun doInBackground(vararg params: Void): Void? {
                    fetchUserInfo()
                    if (fetchUserInfo()) {
                        Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show()
                        activity!!.finish()
                    }
                    return null
                }
            }.execute()
@@ -198,15 +233,16 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon

    }

    private fun fetchUserInfo() {
    private fun fetchUserInfo(): Boolean {
        var error = false

        if (authState!!.authorizationServiceConfiguration == null) {
            // TODO Handle error due to unavailable service configuration
            return
            return true
        }

        authState!!.performActionWithFreshTokens(authorizationService!!, AuthState.AuthStateAction { accessToken, _, ex ->
            if (ex != null) {
                // TODO An exception occurred, handle error
                error = true
                return@AuthStateAction
            }

@@ -218,7 +254,7 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
                userInfoEndpoint = URL(discoveryDoc.userinfoEndpoint!!.toString())
            }
            catch (urlEx: MalformedURLException) {
                // TODO Handle error due to malformed URL
                error = true
                return@AuthStateAction
            }

@@ -232,10 +268,10 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
                updateUserInfo(JSONObject(response))
            }
            catch (ioEx: IOException) {
                // TODO Handle network error
                error = true
            }
            catch (jsonEx: JSONException) {
                // TODO Handle JSON parse error
                error = true
            }
            finally {
                if (userInfoResponse != null) {
@@ -243,12 +279,14 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
                        userInfoResponse.close()
                    }
                    catch (ioEx: IOException) {
                        // TODO Handle network exception while closing response stream
                        error = true
                    }

                }
            }
        })

        return error
    }

    @Throws(IOException::class)
@@ -272,6 +310,11 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
    }

    private fun onAccountInfoGotten() {
        if (!isNetworkAvailable()) {
            Toast.makeText(context, "Please check your internet connection", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }

        if (userInfoJson != null) {
            try {
                var emailAddress = ""
@@ -284,12 +327,14 @@ class GoogleAuthenticatorFragment : Fragment(), AuthorizationService.TokenRespon
                }
            }
            catch (ex: JSONException) {
                // TODO Handle JSON parse error
                Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show()
                activity!!.finish()
            }

        }
        else {
            //TODO Handle error
            Toast.makeText(context, "Login failed, please try again later", Toast.LENGTH_LONG).show()
            activity!!.finish()
        }
    }