diff --git a/app/build.gradle b/app/build.gradle index 4b950ab75a..dd8399fb3b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,12 +186,12 @@ dependencies { //Smart LOck authentication implementation "com.google.android.gms:play-services-auth:${rootConfiguration.playServiceAuthVersion}" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${rootConfiguration.kotlinVersion}" + implementation "com.google.android.gms:play-services-safetynet:${rootConfiguration.safetynetVersion}" //Stetho debugImplementation "com.facebook.stetho:stetho:${rootConfiguration.stethoVersion}" //Stetho network helper debugImplementation "com.facebook.stetho:stetho-okhttp3:${rootConfiguration.stethoVersion}" - releaseImplementation "com.github.iamareebjamal:stetho-noop:1.2.1" } diff --git a/app/config.gradle b/app/config.gradle index 65e2e467d5..8076aa1f03 100644 --- a/app/config.gradle +++ b/app/config.gradle @@ -26,5 +26,6 @@ ext { playServiceAuthVersion='16.0.1' shimmerVersion = "0.5.0" stethoVersion = "1.5.1" + safetynetVersion = "16.0.0" koinVersion = "2.0.1" } diff --git a/app/src/main/java/org/fossasia/susi/ai/data/SignUpModel.kt b/app/src/main/java/org/fossasia/susi/ai/data/SignUpModel.kt index 683036f08a..91b3938292 100644 --- a/app/src/main/java/org/fossasia/susi/ai/data/SignUpModel.kt +++ b/app/src/main/java/org/fossasia/susi/ai/data/SignUpModel.kt @@ -20,10 +20,10 @@ class SignUpModel : ISignUpModel { private lateinit var authResponseCall: Call - override fun signUp(email: String, password: String, listener: ISignUpModel.OnSignUpFinishedListener) { + override fun signUp(email: String, password: String, recaptchaResponse: String, listener: ISignUpModel.OnSignUpFinishedListener) { authResponseCall = ClientBuilder.susiApi - .signUp(email, password) + .signUp(email, password, recaptchaResponse) authResponseCall.enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { diff --git a/app/src/main/java/org/fossasia/susi/ai/data/contract/ISignUpModel.kt b/app/src/main/java/org/fossasia/susi/ai/data/contract/ISignUpModel.kt index 65cb1b2447..a3795fd770 100644 --- a/app/src/main/java/org/fossasia/susi/ai/data/contract/ISignUpModel.kt +++ b/app/src/main/java/org/fossasia/susi/ai/data/contract/ISignUpModel.kt @@ -16,7 +16,7 @@ interface ISignUpModel { fun onSuccess(response: Response) } - fun signUp(email: String, password: String, listener: OnSignUpFinishedListener) + fun signUp(email: String, password: String, recaptchaResponse: String, listener: OnSignUpFinishedListener) fun cancelSignUp() } diff --git a/app/src/main/java/org/fossasia/susi/ai/rest/services/SusiService.kt b/app/src/main/java/org/fossasia/susi/ai/rest/services/SusiService.kt index 5864d0f8d7..54645cb7b2 100644 --- a/app/src/main/java/org/fossasia/susi/ai/rest/services/SusiService.kt +++ b/app/src/main/java/org/fossasia/susi/ai/rest/services/SusiService.kt @@ -71,7 +71,8 @@ interface SusiService { @POST("/aaa/signup.json") fun signUp( @Query("signup") email: String, - @Query("password") password: String + @Query("password") password: String, + @Query("g-recaptcha-response") recaptchaResponse: String ): Call /** diff --git a/app/src/main/java/org/fossasia/susi/ai/signup/SignUpActivity.kt b/app/src/main/java/org/fossasia/susi/ai/signup/SignUpActivity.kt index 3dfa53ff57..30e8d639b2 100644 --- a/app/src/main/java/org/fossasia/susi/ai/signup/SignUpActivity.kt +++ b/app/src/main/java/org/fossasia/susi/ai/signup/SignUpActivity.kt @@ -11,6 +11,9 @@ import android.support.v7.app.AppCompatActivity import android.view.MenuItem import android.view.View import android.widget.Toast +import com.google.android.gms.safetynet.SafetyNet +import com.google.android.gms.tasks.OnFailureListener +import com.google.android.gms.tasks.OnSuccessListener import kotlinx.android.synthetic.main.activity_sign_up.* import org.fossasia.susi.ai.R import org.fossasia.susi.ai.chat.ChatActivity @@ -22,6 +25,7 @@ import org.fossasia.susi.ai.login.LoginActivity import org.fossasia.susi.ai.signup.contract.ISignUpPresenter import org.fossasia.susi.ai.signup.contract.ISignUpView import org.fossasia.susi.ai.skills.SkillsActivity +import timber.log.Timber import org.koin.android.ext.android.inject import org.koin.core.parameter.parametersOf @@ -39,7 +43,7 @@ class SignUpActivity : AppCompatActivity(), ISignUpView { private lateinit var forgotPasswordProgressDialog: Dialog private lateinit var builder: AlertDialog.Builder private var checkDialog: Boolean = false - + private val RECAPTCHA_KEY = "" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_sign_up) @@ -99,8 +103,7 @@ class SignUpActivity : AppCompatActivity(), ISignUpView { startActivity(intent) finish() }) - setNegativeButton(android.R.string.no, DialogInterface.OnClickListener { - dialog, id -> dialog.cancel() + setNegativeButton(android.R.string.no, DialogInterface.OnClickListener { dialog, id -> dialog.cancel() }) show() } @@ -249,21 +252,39 @@ class SignUpActivity : AppCompatActivity(), ISignUpView { } private fun signUp() { - signUp.setOnClickListener { + verifyRecaptcha() + } + } - email.error = null - password.error = null - confirmPassword.error = null - inputUrlSignUp.error = null - - val stringEmail = email.editText?.text.toString() - val stringPassword = password.editText?.text.toString() - val stringConfirmPassword = confirmPassword.editText?.text.toString() - val stringURL = inputUrlSignUp.editText?.text.toString() + fun verifyRecaptcha() { + if (RECAPTCHA_KEY != "") { + SafetyNet.getClient(this).verifyWithRecaptcha(RECAPTCHA_KEY) + .addOnSuccessListener(this, OnSuccessListener { response -> + val userResponseToken = response.tokenResult + Timber.d("Great", "Captcha verification started") + if (response.tokenResult?.isNotEmpty() == true) { + email.error = null + password.error = null + confirmPassword.error = null + inputUrlSignUp.error = null + + val stringEmail = email.editText?.text.toString() + val stringPassword = password.editText?.text.toString() + val stringConfirmPassword = confirmPassword.editText?.text.toString() + val stringURL = inputUrlSignUp.editText?.text.toString() + signUpPresenter.signUp(stringEmail, stringPassword, stringConfirmPassword, !customServerSignUp.isChecked, stringURL, acceptTermsAndConditions.isChecked, userResponseToken) + } + }) + .addOnFailureListener(this, OnFailureListener { e -> + Timber.e("Error: " + e) + }) + } else { Toast.makeText(this, "NO ReCaptcha key available", Toast.LENGTH_LONG).show() } + } - signUpPresenter.signUp(stringEmail, stringPassword, stringConfirmPassword, !customServerSignUp.isChecked, stringURL, acceptTermsAndConditions.isChecked) - } + override fun onDestroy() { + signUpPresenter.onDetach() + super.onDestroy() } override fun showForgotPasswordProgress(boolean: Boolean) { diff --git a/app/src/main/java/org/fossasia/susi/ai/signup/SignUpPresenter.kt b/app/src/main/java/org/fossasia/susi/ai/signup/SignUpPresenter.kt index 05ced141a2..4cb0d770cb 100644 --- a/app/src/main/java/org/fossasia/susi/ai/signup/SignUpPresenter.kt +++ b/app/src/main/java/org/fossasia/susi/ai/signup/SignUpPresenter.kt @@ -31,7 +31,7 @@ class SignUpPresenter(private val forgotPasswordModel: ForgotPasswordModel, priv private var settingView: ISettingsView? = null lateinit var email: String - override fun signUp(email: String, password: String, conpass: String, isSusiServerSelected: Boolean, url: String, isTermsAndConditionSelected: Boolean) { + override fun signUp(email: String, password: String, conpass: String, isSusiServerSelected: Boolean, url: String, isTermsAndConditionSelected: Boolean, recaptchaResponse: String) { if (email.isEmpty()) { signUpView?.invalidCredentials(true, Constant.EMAIL) @@ -80,7 +80,7 @@ class SignUpPresenter(private val forgotPasswordModel: ForgotPasswordModel, priv this.email = email signUpView?.showProgress(true) - signUpModel.signUp(email.trim { it <= ' ' }.toLowerCase(), password, this) + signUpModel.signUp(email.trim { it <= ' ' }.toLowerCase(), password, recaptchaResponse, this) } override fun onError(throwable: Throwable) { diff --git a/app/src/main/java/org/fossasia/susi/ai/signup/contract/ISignUpPresenter.kt b/app/src/main/java/org/fossasia/susi/ai/signup/contract/ISignUpPresenter.kt index af75ba5cc3..f022acad0e 100644 --- a/app/src/main/java/org/fossasia/susi/ai/signup/contract/ISignUpPresenter.kt +++ b/app/src/main/java/org/fossasia/susi/ai/signup/contract/ISignUpPresenter.kt @@ -8,7 +8,9 @@ package org.fossasia.susi.ai.signup.contract interface ISignUpPresenter { - fun signUp(email: String, password: String, conpass: String, isSusiServerSelected: Boolean, url: String, isTermsAndConditionSelected: Boolean) + fun onAttach(signUpView: ISignUpView) + + fun signUp(email: String, password: String, conpass: String, isSusiServerSelected: Boolean, url: String, isTermsAndConditionSelected: Boolean, recaptchaResponse: String) fun cancelSignUp()