saleks28

MainActivity

Sep 14th, 2020
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 5.90 KB | None | 0 0
  1. package io.nemiron.fileencryptor
  2.  
  3. import android.content.Context
  4. import android.content.Intent
  5. import androidx.appcompat.app.AppCompatActivity
  6. import android.os.Bundle
  7. import android.util.Base64
  8. import android.view.View
  9. import android.widget.Toast
  10. import io.nemiron.fileencryptor.utils.CipherData
  11. import io.nemiron.fileencryptor.Encryption
  12. import kotlinx.android.synthetic.main.activity_main.*
  13. import java.text.DateFormat
  14. import java.util.*
  15.  
  16. class MainActivity : AppCompatActivity() {
  17.  
  18.     private var isSignedUp = false
  19.  
  20.     private lateinit var Encryption: Encryption
  21.  
  22.     override fun onCreate(savedInstanceState: Bundle?) {
  23.         super.onCreate(savedInstanceState)
  24.         setContentView(R.layout.activity_main)
  25.         // TODO (убрать потом лишние переходы)
  26.  
  27.         Encryption = Encryption()
  28.  
  29.         //startActivity(intentFor<DataListActivity>())
  30.         updateLoggedState()
  31.     }
  32.  
  33.     // обработчик нажатия Login'а
  34.     fun loginPressed(v: View) {
  35.         val password = login_password.text.toString()
  36.  
  37.         if (isSignedUp) {
  38.             val lastLogin = lastLoggedIn()
  39.             if (lastLogin != null) {
  40.                 Toast.makeText(this, "Last login: $lastLogin",Toast.LENGTH_LONG).show()
  41.                 val intent = Intent(this, CipherDataActivity::class.java)
  42.                 startActivity(intent)
  43.             }
  44.             else {
  45.                 Toast.makeText(this, "Please check your password and try again.",Toast.LENGTH_LONG).show()
  46.             }
  47.         } else {
  48.             when {
  49.                 password.isEmpty() -> Toast.makeText(this, getString(R.string.enter_password),Toast.LENGTH_LONG).show()
  50.                 password != confirm_password.text.toString() -> Toast.makeText(this, getString(R.string.password_not_match), Toast.LENGTH_LONG).show()
  51.                 //!password.isStrengthPassword() -> Toast.makeText(this,getString(R.string.password_requirements), Toast.LENGTH_LONG).show()
  52.                 else -> {
  53.                     Toast.makeText(this, "Successful login!",Toast.LENGTH_LONG).show()
  54.                     saveLoginInfo()
  55.                     val intent = Intent(this, CipherDataActivity::class.java)
  56.                     startActivity(intent)}
  57.             }
  58.         }
  59.     }
  60.  
  61.     // вызов activty со сменой пароля
  62.     fun forgotPassword(v: View) {
  63.         Toast.makeText(this, "Yoy forgot password!",Toast.LENGTH_LONG).show()
  64.         /*startActivity(intentFor<AddDataActivity>())*/
  65.     }
  66.  
  67.  
  68.     /* расширение String для проверки сложности пароля:
  69.      * 10+ символов, мин. 1 заглавная буква, мин. 1 цифра, мин. 1 спец. символ
  70.     */
  71.     private fun String.isStrengthPassword() =
  72.         this.matches(Regex("^(?=.*[A-Z]+)(?=.*\\d+)(?=.*[!@#\$%^&*()_+=]+).{10,}\$"))
  73.  
  74.     private fun saveLoginInfo() {
  75.         // копируем введёный пароль в массив байтов
  76.         val password = CharArray(login_password.length())
  77.         login_password.text.getChars(0, login_password.length(), password, 0)
  78.  
  79.         // шифруем дату логина и кодируем в base64 шифртекст и параметры шифрования
  80.         val currentDateTimeString = DateFormat.getDateTimeInstance().format(Date())
  81.         val hashMap = Encryption.encrypt(
  82.             currentDateTimeString.toByteArray(Charsets.UTF_8), password
  83.         )
  84.         val valueBase64 = Base64.encodeToString(hashMap["encrypted"], Base64.NO_WRAP)
  85.         val saltBase64 = Base64.encodeToString(hashMap["salt"], Base64.NO_WRAP)
  86.         val ivBase64 = Base64.encodeToString(hashMap["iv"], Base64.NO_WRAP)
  87.  
  88.         // сохраняем данные в shared preferences
  89.         val editor = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE).edit()
  90.         editor.putString("l", valueBase64)
  91.         editor.putString("lsalt", saltBase64)
  92.         editor.putString("liv", ivBase64)
  93.         editor.apply()
  94.     }
  95.  
  96.     // обновление окна входа, если пользователь был ранее зарегистрирован
  97.     private fun updateLoggedState() = if (isSignedIn()) {
  98.         isSignedUp = true
  99.         login_button.text = getString(R.string.login)
  100.         confirm_password.visibility = View.INVISIBLE
  101. //        forgot_password.visibility = View.VISIBLE
  102.     } else {
  103.         login_button.text = getString(R.string.sign_up)
  104.     }
  105.  
  106.     // был ли пользователь уже зарегистрирован в приложении
  107.     private fun isSignedIn() =
  108.         getSharedPreferences("AppPrefs", Context.MODE_PRIVATE).getString("l", null) != null
  109.  
  110.     // проверяем пароль
  111.     private fun lastLoggedIn(): String? {
  112.         // копируем введёный пароль в массив байтов
  113.         val password = CharArray(login_password.length())
  114.         login_password.text.getChars(0, login_password.length(), password, 0)
  115.  
  116.         // восстанавливаем зашифрованные данные последнего входа
  117.         val preferences = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE)
  118.         val base64Encrypted = preferences.getString("l", "")
  119.         val base64Salt = preferences.getString("lsalt", "")
  120.         val base64Iv = preferences.getString("liv", "")
  121.  
  122.         // декодируем данные из base64
  123.         val encrypted = Base64.decode(base64Encrypted, Base64.NO_WRAP)
  124.         val iv = Base64.decode(base64Iv, Base64.NO_WRAP)
  125.         val salt = Base64.decode(base64Salt, Base64.NO_WRAP)
  126.  
  127.         val decrypted = Encryption.decrypt(
  128.             hashMapOf("iv" to iv, "salt" to salt, "encrypted" to encrypted), password
  129.         )
  130.  
  131.         var lastLoggedIn: String? = null
  132.         decrypted?.let { lastLoggedIn = String(it, Charsets.UTF_8) }
  133.         return lastLoggedIn
  134.     }
  135. }
Add Comment
Please, Sign In to add comment