Skip to content

Commit

Permalink
feat(auth): AND-6755 Auth fix call (#4103)
Browse files Browse the repository at this point in the history
  • Loading branch information
antonis-bc committed Nov 15, 2022
1 parent a73fe50 commit 7ca6306
Show file tree
Hide file tree
Showing 40 changed files with 408 additions and 546 deletions.
Expand Up @@ -46,7 +46,8 @@ val serviceModule = module {
} else {
null
},
captchaSiteKey = getProperty("site-key")
captchaSiteKey = getProperty("site-key"),
sessionIdService = get()
)
}

Expand Down
Expand Up @@ -418,7 +418,7 @@ class LoginActivity :
.replace(
R.id.content_frame,
VerifyDeviceFragment.newInstance(
newState.sessionId, newState.email, newState.captcha
newState.email, newState.captcha
),
VerifyDeviceFragment::class.simpleName
)
Expand All @@ -442,7 +442,7 @@ class LoginActivity :
} else {
analytics.logEvent(LoginAnalytics.LoginIdentifierEntered)
model.process(
LoginIntents.ObtainSessionIdForEmail(
LoginIntents.SendEmail(
selectedEmail = selectedEmail,
captcha = response.tokenResult
)
Expand Down
24 changes: 2 additions & 22 deletions app/src/main/java/piuk/blockchain/android/ui/login/LoginIntents.kt
Expand Up @@ -42,28 +42,15 @@ sealed class LoginIntents : MviIntent<LoginState> {
)
}

data class ObtainSessionIdForEmail(
val selectedEmail: String,
val captcha: String
) : LoginIntents() {
override fun reduce(oldState: LoginState): LoginState =
oldState.copy(
email = selectedEmail,
captcha = captcha,
currentStep = LoginStep.GET_SESSION_ID
)
}

data class SendEmail(
val sessionId: String,
val selectedEmail: String,
val captcha: String
) : LoginIntents() {
override fun reduce(oldState: LoginState): LoginState =
oldState.copy(
email = selectedEmail,
sessionId = sessionId,
currentStep = LoginStep.SEND_EMAIL
currentStep = LoginStep.SEND_EMAIL,
captcha = captcha,
)
}

Expand Down Expand Up @@ -135,13 +122,6 @@ sealed class LoginIntents : MviIntent<LoginState> {
)
}

object GetSessionIdFailed : LoginIntents() {
override fun reduce(oldState: LoginState): LoginState =
oldState.copy(
currentStep = LoginStep.SHOW_SESSION_ERROR
)
}

object ShowEmailFailed : LoginIntents() {
override fun reduce(oldState: LoginState): LoginState =
oldState.copy(
Expand Down
Expand Up @@ -40,16 +40,11 @@ class LoginInteractor(
}
.doOnError { appUtil.clearCredentials() }

fun obtainSessionId(email: String): Single<ResponseBody> =
authDataManager.createSessionId(email)

fun sendEmailForVerification(
sessionId: String,
email: String,
captcha: String
): Completable {
authPrefs.sessionId = sessionId
return authDataManager.sendEmailForAuthentication(sessionId, email, captcha)
return authDataManager.sendEmailForAuthentication(email, captcha)
}

@ExperimentalSerializationApi
Expand Down Expand Up @@ -112,9 +107,9 @@ class LoginInteractor(
}
}

fun pollForAuth(sessionId: String, json: Json): Single<PollResult<ResponseBody>> {
fun pollForAuth(json: Json): Single<PollResult<ResponseBody>> {
authPollService = PollService(
authDataManager.getDeeplinkPayload(sessionId)
authDataManager.getDeeplinkPayload()
) {
val responseBodyString = it.peekResponseBody()
try {
Expand Down
31 changes: 3 additions & 28 deletions app/src/main/java/piuk/blockchain/android/ui/login/LoginModel.kt
Expand Up @@ -16,7 +16,6 @@ import kotlinx.coroutines.rx3.rxSingle
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.ResponseBody
import org.json.JSONObject
import piuk.blockchain.android.maintenance.domain.model.AppMaintenanceStatus
import piuk.blockchain.android.maintenance.domain.usecase.GetAppMaintenanceConfigUseCase
import piuk.blockchain.android.ui.login.auth.LoginAuthInfo
Expand All @@ -40,14 +39,9 @@ class LoginModel(
null
}
is LoginIntents.LoginWithQr -> loginWithQrCode(intent.qrString)
is LoginIntents.ObtainSessionIdForEmail ->
obtainSessionId(
intent.selectedEmail,
intent.captcha
)

is LoginIntents.SendEmail ->
sendVerificationEmail(
intent.sessionId,
intent.selectedEmail,
intent.captcha,
previousState.pollingState
Expand Down Expand Up @@ -151,7 +145,7 @@ class LoginModel(
val jsonBuilder = Json {
ignoreUnknownKeys = true
}
return Single.defer { interactor.pollForAuth(previousState.sessionId, jsonBuilder) }
return Single.defer { interactor.pollForAuth(jsonBuilder) }
.subscribeBy(
onSuccess = {
when (it) {
Expand Down Expand Up @@ -211,31 +205,12 @@ class LoginModel(
}
)

private fun obtainSessionId(email: String, captcha: String): Disposable =
interactor.obtainSessionId(email)
.subscribeBy(
onSuccess = { responseBody ->
val response = JSONObject(responseBody.string())
if (response.has(SESSION_TOKEN)) {
val sessionId = response.getString(SESSION_TOKEN)
process(LoginIntents.SendEmail(sessionId, email, captcha))
} else {
process(LoginIntents.GetSessionIdFailed)
}
},
onError = { throwable ->
Timber.e(throwable)
process(LoginIntents.GetSessionIdFailed)
}
)

private fun sendVerificationEmail(
sessionId: String,
email: String,
captcha: String,
pollingState: AuthPollingState
): Disposable =
interactor.sendEmailForVerification(sessionId, email, captcha)
interactor.sendEmailForVerification(email, captcha)
.subscribeBy(
onComplete = {
process(LoginIntents.ShowEmailSent)
Expand Down
Expand Up @@ -17,7 +17,6 @@ enum class LoginStep {
NAVIGATE_FROM_PAYLOAD,
NAVIGATE_TO_WALLET_CONNECT,
POLLING_PAYLOAD_ERROR,
GET_SESSION_ID,
SEND_EMAIL,
VERIFY_DEVICE,
MANUAL_PAIRING,
Expand All @@ -29,7 +28,6 @@ enum class LoginStep {
data class LoginState(
val email: String = "",
val captcha: String = "",
val sessionId: String = "",
val currentStep: LoginStep = LoginStep.SELECT_METHOD,
val shouldRestartApp: Boolean = false,
val intentAction: String? = null,
Expand All @@ -42,7 +40,7 @@ data class LoginState(
val loginApprovalState: LoginApprovalState = LoginApprovalState.NONE
) : MviState {
val isLoading: Boolean
get() = setOf(LoginStep.LOG_IN, LoginStep.GET_SESSION_ID, LoginStep.SEND_EMAIL).contains(currentStep)
get() = setOf(LoginStep.LOG_IN, LoginStep.SEND_EMAIL).contains(currentStep)
val isTypingEmail: Boolean
get() = setOf(LoginStep.ENTER_EMAIL, LoginStep.SEND_EMAIL).contains(currentStep)
}
Expand Down
Expand Up @@ -44,10 +44,6 @@ class VerifyDeviceFragment : Fragment(), Analytics by get(Analytics::class.java)
arguments?.getString(EMAIL) ?: throw IllegalArgumentException("No email specified")
}

private val sessionId: String by lazy {
arguments?.getString(SESSION_ID) ?: throw IllegalArgumentException("No session id specified")
}

private val captcha: String by lazy {
arguments?.getString(CAPTCHA) ?: throw IllegalArgumentException("No captcha specified")
}
Expand Down Expand Up @@ -81,7 +77,7 @@ class VerifyDeviceFragment : Fragment(), Analytics by get(Analytics::class.java)
if (!isTimerRunning.get()) {
timer.start()
(requireActivity() as LoginIntentCoordinator)
.process(LoginIntents.SendEmail(sessionId, email, captcha))
.process(LoginIntents.SendEmail(email, captcha))
BlockchainSnackbar.make(
root, getString(R.string.verify_device_email_resent),
type = SnackbarType.Success
Expand Down Expand Up @@ -127,10 +123,9 @@ class VerifyDeviceFragment : Fragment(), Analytics by get(Analytics::class.java)
private const val EMAIL = "EMAIL"
private const val CAPTCHA = "CAPTCHA"

fun newInstance(sessionId: String, email: String, captcha: String): Fragment =
fun newInstance(email: String, captcha: String): Fragment =
VerifyDeviceFragment().apply {
arguments = Bundle().apply {
putString(SESSION_ID, sessionId)
putString(EMAIL, email)
putString(CAPTCHA, captcha)
}
Expand Down
Expand Up @@ -37,8 +37,8 @@ class LoginAuthInteractor(

fun clearSessionId() = authPrefs.clearSessionId()

fun authorizeApproval(authToken: String, sessionId: String): Single<JsonObject> {
return authDataManager.authorizeSessionObject(authToken, sessionId)
fun authorizeApproval(authToken: String): Single<JsonObject> {
return authDataManager.authorizeSessionObject(authToken)
}

fun getPayload(guid: String, sessionId: String): Single<JsonObject> =
Expand Down Expand Up @@ -75,19 +75,16 @@ class LoginAuthInteractor(

fun submitCode(
guid: String,
sessionId: String,
code: String,
payloadJson: String
): Single<ResponseBody> {
return Single.fromObservable(
authDataManager.submitTwoFactorCode(sessionId, guid, code).map { response ->
val responseObject = JSONObject(payloadJson).apply {
put(LoginAuthIntents.PAYLOAD, response.string())
}
responseObject.toString()
.toResponseBody("application/json".toMediaTypeOrNull())
return authDataManager.submitTwoFactorCode(guid, code).map { response ->
val responseObject = JSONObject(payloadJson).apply {
put(LoginAuthIntents.PAYLOAD, response.string())
}
)
responseObject.toString()
.toResponseBody("application/json".toMediaTypeOrNull())
}
}

fun updateMobileSetup(isMobileSetup: Boolean, deviceType: Int): Completable =
Expand Down
Expand Up @@ -26,7 +26,6 @@ class LoginAuthModel(
is LoginAuthIntents.AuthorizeApproval ->
authorizeApproval(
authToken = previousState.authToken,
sessionId = intent.sessionId
)
is LoginAuthIntents.GetPayload -> getPayload(guid = previousState.guid, sessionId = previousState.sessionId)
is LoginAuthIntents.VerifyPassword ->
Expand All @@ -42,7 +41,6 @@ class LoginAuthModel(
submitCode(
guid = previousState.guid,
password = intent.password,
sessionId = previousState.sessionId,
code = intent.code,
payloadJson = previousState.payloadJson
)
Expand Down Expand Up @@ -101,8 +99,8 @@ class LoginAuthModel(
return null
}

private fun authorizeApproval(authToken: String, sessionId: String): Disposable {
return interactor.authorizeApproval(authToken, sessionId)
private fun authorizeApproval(authToken: String): Disposable {
return interactor.authorizeApproval(authToken)
.subscribeBy(
onSuccess = { process(LoginAuthIntents.GetPayload) },
onError = { throwable ->
Expand Down Expand Up @@ -147,11 +145,10 @@ class LoginAuthModel(
private fun submitCode(
guid: String,
password: String,
sessionId: String,
code: String,
payloadJson: String
): Disposable {
return interactor.submitCode(guid, sessionId, code, payloadJson)
return interactor.submitCode(guid, code, payloadJson)
.subscribeBy(
onSuccess = { responseBody ->
process(LoginAuthIntents.VerifyPassword(password, responseBody.string()))
Expand Down
Expand Up @@ -43,7 +43,7 @@ class AccountRecoveryInteractor(
}

private fun restoreWallet() = Completable.fromCallable {
payloadDataManager.wallet?.let { wallet ->
payloadDataManager.wallet.let { wallet ->
authPrefs.sharedKey = wallet.sharedKey
authPrefs.walletGuid = wallet.guid
}
Expand Down
Expand Up @@ -97,7 +97,7 @@ class PinInteractor internal constructor(
mobileNoticeRemoteConfig.mobileNoticeDialog()

fun createPin(tempPassword: String, pin: String): Completable =
authDataManager.createPin(tempPassword, pin)
authDataManager.createPin(tempPassword, pin,)
.then { verifyCloudBackup() }

fun checkForceUpgradeStatus(versionName: String): Observable<UpdateType> {
Expand All @@ -110,7 +110,6 @@ class PinInteractor internal constructor(
isIntercomEnabled: Boolean
): Single<String> =
authDataManager.validatePin(pin)
.firstOrError()
.flatMap { validatedPin ->
if (isIntercomEnabled) {
registerIntercomUser()
Expand Down Expand Up @@ -161,7 +160,7 @@ class PinInteractor internal constructor(
}

fun updateShareKeyInPrefs() {
authPrefs.sharedKey = payloadManager.wallet?.sharedKey.orEmpty()
authPrefs.sharedKey = payloadManager.wallet.sharedKey.orEmpty()
}

fun isWalletUpgradeRequired(): Boolean = payloadManager.isWalletUpgradeRequired
Expand Down
Expand Up @@ -124,7 +124,6 @@ class ManualPairingActivity : MvpActivity<ManualPairingView, ManualPairingPresen

override fun showTwoFactorCodeNeededDialog(
responseObject: JSONObject,
sessionId: String,
authType: Int,
guid: String,
password: String
Expand All @@ -135,7 +134,6 @@ class ManualPairingActivity : MvpActivity<ManualPairingView, ManualPairingPresen
val dialog = getTwoFactorDialog(this, authType, walletPrefs, positiveAction = {
presenter.submitTwoFactorCode(
responseObject,
sessionId,
guid,
password,
it
Expand Down

0 comments on commit 7ca6306

Please sign in to comment.