Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package io.nemiron.fileencryptor
- import android.content.Context
- import android.content.Intent
- import androidx.appcompat.app.AppCompatActivity
- import android.os.Bundle
- import android.util.Base64
- import android.view.View
- import android.widget.Toast
- import io.nemiron.fileencryptor.utils.CipherData
- import io.nemiron.fileencryptor.Encryption
- import kotlinx.android.synthetic.main.activity_main.*
- import java.text.DateFormat
- import java.util.*
- class MainActivity : AppCompatActivity() {
- private var isSignedUp = false
- private lateinit var Encryption: Encryption
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- // TODO (убрать потом лишние переходы)
- Encryption = Encryption()
- //startActivity(intentFor<DataListActivity>())
- updateLoggedState()
- }
- // обработчик нажатия Login'а
- fun loginPressed(v: View) {
- val password = login_password.text.toString()
- if (isSignedUp) {
- val lastLogin = lastLoggedIn()
- if (lastLogin != null) {
- Toast.makeText(this, "Last login: $lastLogin",Toast.LENGTH_LONG).show()
- val intent = Intent(this, CipherDataActivity::class.java)
- startActivity(intent)
- }
- else {
- Toast.makeText(this, "Please check your password and try again.",Toast.LENGTH_LONG).show()
- }
- } else {
- when {
- password.isEmpty() -> Toast.makeText(this, getString(R.string.enter_password),Toast.LENGTH_LONG).show()
- password != confirm_password.text.toString() -> Toast.makeText(this, getString(R.string.password_not_match), Toast.LENGTH_LONG).show()
- //!password.isStrengthPassword() -> Toast.makeText(this,getString(R.string.password_requirements), Toast.LENGTH_LONG).show()
- else -> {
- Toast.makeText(this, "Successful login!",Toast.LENGTH_LONG).show()
- saveLoginInfo()
- val intent = Intent(this, CipherDataActivity::class.java)
- startActivity(intent)}
- }
- }
- }
- // вызов activty со сменой пароля
- fun forgotPassword(v: View) {
- Toast.makeText(this, "Yoy forgot password!",Toast.LENGTH_LONG).show()
- /*startActivity(intentFor<AddDataActivity>())*/
- }
- /* расширение String для проверки сложности пароля:
- * 10+ символов, мин. 1 заглавная буква, мин. 1 цифра, мин. 1 спец. символ
- */
- private fun String.isStrengthPassword() =
- this.matches(Regex("^(?=.*[A-Z]+)(?=.*\\d+)(?=.*[!@#\$%^&*()_+=]+).{10,}\$"))
- private fun saveLoginInfo() {
- // копируем введёный пароль в массив байтов
- val password = CharArray(login_password.length())
- login_password.text.getChars(0, login_password.length(), password, 0)
- // шифруем дату логина и кодируем в base64 шифртекст и параметры шифрования
- val currentDateTimeString = DateFormat.getDateTimeInstance().format(Date())
- val hashMap = Encryption.encrypt(
- currentDateTimeString.toByteArray(Charsets.UTF_8), password
- )
- val valueBase64 = Base64.encodeToString(hashMap["encrypted"], Base64.NO_WRAP)
- val saltBase64 = Base64.encodeToString(hashMap["salt"], Base64.NO_WRAP)
- val ivBase64 = Base64.encodeToString(hashMap["iv"], Base64.NO_WRAP)
- // сохраняем данные в shared preferences
- val editor = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE).edit()
- editor.putString("l", valueBase64)
- editor.putString("lsalt", saltBase64)
- editor.putString("liv", ivBase64)
- editor.apply()
- }
- // обновление окна входа, если пользователь был ранее зарегистрирован
- private fun updateLoggedState() = if (isSignedIn()) {
- isSignedUp = true
- login_button.text = getString(R.string.login)
- confirm_password.visibility = View.INVISIBLE
- // forgot_password.visibility = View.VISIBLE
- } else {
- login_button.text = getString(R.string.sign_up)
- }
- // был ли пользователь уже зарегистрирован в приложении
- private fun isSignedIn() =
- getSharedPreferences("AppPrefs", Context.MODE_PRIVATE).getString("l", null) != null
- // проверяем пароль
- private fun lastLoggedIn(): String? {
- // копируем введёный пароль в массив байтов
- val password = CharArray(login_password.length())
- login_password.text.getChars(0, login_password.length(), password, 0)
- // восстанавливаем зашифрованные данные последнего входа
- val preferences = getSharedPreferences("AppPrefs", Context.MODE_PRIVATE)
- val base64Encrypted = preferences.getString("l", "")
- val base64Salt = preferences.getString("lsalt", "")
- val base64Iv = preferences.getString("liv", "")
- // декодируем данные из base64
- val encrypted = Base64.decode(base64Encrypted, Base64.NO_WRAP)
- val iv = Base64.decode(base64Iv, Base64.NO_WRAP)
- val salt = Base64.decode(base64Salt, Base64.NO_WRAP)
- val decrypted = Encryption.decrypt(
- hashMapOf("iv" to iv, "salt" to salt, "encrypted" to encrypted), password
- )
- var lastLoggedIn: String? = null
- decrypted?.let { lastLoggedIn = String(it, Charsets.UTF_8) }
- return lastLoggedIn
- }
- }
Add Comment
Please, Sign In to add comment