diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 98666f878201db8f8772ca40fe156f5be90dc204..9253460bd0ad9274522ae288cd7e19e4e4356a64 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -51,6 +51,7 @@ dependencies { implementation(libs.androidx.navigation.ui.ktx) implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation("androidx.security:security-crypto:1.0.0") testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/itb/bos/bondoman/LoginActivity.kt b/app/src/main/java/itb/bos/bondoman/LoginActivity.kt index 725995bf637a9644d652f54cc9e13352721134d2..669050c2d9b7c78c5a23e7cefa5bd44f3fb52eb5 100644 --- a/app/src/main/java/itb/bos/bondoman/LoginActivity.kt +++ b/app/src/main/java/itb/bos/bondoman/LoginActivity.kt @@ -34,6 +34,9 @@ class LoginActivity : AppCompatActivity() { val email = findViewById<EditText>(R.id.email).text.toString() val password = findViewById<EditText>(R.id.password).text.toString() loginViewModel.login(email, password) + // After successful login + // loginViewModel.checkToken() + } } } diff --git a/app/src/main/java/itb/bos/bondoman/viewModel/LoginViewModel.kt b/app/src/main/java/itb/bos/bondoman/viewModel/LoginViewModel.kt index 6eea4e95b36741aa6fb5dbdbd030d3be22692611..1d2ab233c0b4cb95e53976a49ae48393167a4b87 100644 --- a/app/src/main/java/itb/bos/bondoman/viewModel/LoginViewModel.kt +++ b/app/src/main/java/itb/bos/bondoman/viewModel/LoginViewModel.kt @@ -1,8 +1,11 @@ package itb.bos.bondoman.viewModel + import android.annotation.SuppressLint import android.content.Context import android.util.Log import android.widget.Toast +import androidx.security.crypto.EncryptedSharedPreferences +import androidx.security.crypto.MasterKeys import androidx.lifecycle.ViewModel import itb.bos.bondoman.helper.performLogin import kotlinx.coroutines.CoroutineScope @@ -11,10 +14,22 @@ import kotlinx.coroutines.launch class LoginViewModel : ViewModel() { + private lateinit var encryptedSharedPreferences: EncryptedSharedPreferences + @SuppressLint("StaticFieldLeak") private lateinit var context: Context fun init(context: Context) { + val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) + encryptedSharedPreferences = EncryptedSharedPreferences.create( + "login", + masterKeyAlias, + context.applicationContext, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) as EncryptedSharedPreferences + Log.d("EncryptedSharedPreferences", encryptedSharedPreferences.toString()) + this.context = context } @@ -47,8 +62,7 @@ class LoginViewModel : ViewModel() { } private fun storeToken(token: String) { - val sharedPreferences = context.getSharedPreferences("login", Context.MODE_PRIVATE) - sharedPreferences.edit().putString("token", token).apply() + encryptedSharedPreferences.edit().putString("token", token).apply() } private fun handleLoginFailure(e: Exception) { @@ -57,8 +71,15 @@ class LoginViewModel : ViewModel() { } fun getToken(): String? { - val sharedPreferences = context.getSharedPreferences("login", Context.MODE_PRIVATE) - return sharedPreferences.getString("token", null) + return encryptedSharedPreferences.getString("token", null) } -} + fun checkToken() { + val token = getToken() + if (token != null) { + Log.d("Token", "Token retrieved successfully: $token") + } else { + Log.d("Token", "No token found") + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dcb30081cbdf6209ccb1e018250087eccdab48c0..4ffc98fef3e4040bfe9fcb2a342da26bd269aa78 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,7 @@ lifecycleLivedataKtx = "2.6.1" lifecycleViewmodelKtx = "2.6.1" navigationFragmentKtx = "2.6.0" navigationUiKtx = "2.6.0" +securityCryptoKtx = "1.0.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -27,6 +28,7 @@ androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecy androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" } androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" } +androidx-security-crypto-ktx = { group = "androidx.security", name = "security-crypto-ktx", version.ref = "securityCryptoKtx" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }