diff --git a/app/build.gradle b/app/build.gradle index 64b29df2ae..c15c48193c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -189,4 +189,6 @@ dependencies { debugImplementation "com.facebook.stetho:stetho-okhttp3:${rootConfiguration.stethoVersion}" releaseImplementation "com.github.iamareebjamal:stetho-noop:1.2.1" + + implementation "com.google.android.gms:play-services-safetynet:${rootConfiguration.safetynetVersion}" } diff --git a/app/config.gradle b/app/config.gradle index d743e20f2e..48638b6a88 100644 --- a/app/config.gradle +++ b/app/config.gradle @@ -26,4 +26,5 @@ ext { playServiceAuthVersion='16.0.1' shimmerVersion = "0.5.0" stethoVersion = "1.5.1" + safetynetVersion = "16.0.0" } 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 567afc2b02..065d74eb41 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 /** *

The SignUp activity.

@@ -37,6 +41,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 = "6LcKhbMUAAAAAGFbYZeNFzqol-7EjOHUK5MvEeOE" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -100,8 +105,8 @@ 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() } @@ -251,20 +256,29 @@ class SignUpActivity : AppCompatActivity(), ISignUpView { private fun signUp() { - signUp.setOnClickListener { - - 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) - } + verifyRecaptcha() + } + fun verifyRecaptcha() { + + SafetyNet.getClient(this).verifyWithRecaptcha(RECAPTCHA_KEY) + .addOnSuccessListener(this, OnSuccessListener { response -> + val userResponseToken = response.tokenResult + 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) + }) } override fun onDestroy() { 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 c4ef3362a5..2f3e2a2292 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 @@ -41,8 +41,7 @@ class SignUpPresenter(signUpActivity: SignUpActivity) : ISignUpPresenter, ISignU this.signUpView = signUpView } - 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) return @@ -90,7 +89,7 @@ class SignUpPresenter(signUpActivity: SignUpActivity) : ISignUpPresenter, ISignU 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 4fd417367b..759b5ce721 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 @@ -10,7 +10,7 @@ interface ISignUpPresenter { fun onAttach(signUpView: ISignUpView) - fun signUp(email: String, password: String, conpass: String, isSusiServerSelected: Boolean, url: String, isTermsAndConditionSelected: Boolean) + fun signUp(email: String, password: String, conpass: String, isSusiServerSelected: Boolean, url: String, isTermsAndConditionSelected: Boolean, recaptchaResponse: String) fun onDetach()