2025-01-13 12:56:42 +00:00
|
|
|
|
import java.time.LocalDate
|
2025-01-14 12:45:14 +00:00
|
|
|
|
import java.security.SecureRandom
|
|
|
|
|
import javax.crypto.SecretKeyFactory
|
|
|
|
|
import javax.crypto.spec.PBEKeySpec
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
/*
|
2025-01-13 12:56:42 +00:00
|
|
|
|
val authorizeList = mutableListOf<UserAuthorize>()
|
2025-01-14 12:45:14 +00:00
|
|
|
|
*/
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
/*
|
2025-01-13 12:56:42 +00:00
|
|
|
|
fun main(){
|
|
|
|
|
authorizeList.add(registration())
|
2025-01-14 12:45:14 +00:00
|
|
|
|
val user = authorize()
|
|
|
|
|
if (user != null){
|
|
|
|
|
when(user.role){"администратор" -> adminPanel()
|
|
|
|
|
else -> println("уходи ты не админ")}
|
|
|
|
|
}
|
2025-01-13 12:56:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
fun adminPanel() {
|
|
|
|
|
println("Добро пожаловать в панель администратора!")
|
|
|
|
|
var action: Int
|
|
|
|
|
do {
|
|
|
|
|
println("Выберите действие:")
|
|
|
|
|
println("1. Вывести всех пользователей")
|
|
|
|
|
println("2. Поменять пароль пользователя")
|
|
|
|
|
println("3. Удалить пользователя")
|
|
|
|
|
println("4. Вывести пользователей по дате последнего входа (убывание)")
|
|
|
|
|
println("0. Выйти из панели администратора")
|
|
|
|
|
|
|
|
|
|
action = readln().toInt()
|
|
|
|
|
|
|
|
|
|
when (action) {
|
|
|
|
|
1 -> showAllUsers()
|
|
|
|
|
2 -> changeUserPassword()
|
|
|
|
|
3 -> deleteUser()
|
|
|
|
|
4 -> showUsersSortedByDate()
|
|
|
|
|
0 -> println("Выход из панели администратора.")
|
|
|
|
|
else -> println("Неверный выбор. Попробуйте снова.")
|
|
|
|
|
}
|
|
|
|
|
} while (action != 0)
|
2025-01-13 12:56:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
fun showAllUsers() {
|
|
|
|
|
if (authorizeList.isEmpty()) {
|
|
|
|
|
println("Нет пользователей.")
|
|
|
|
|
} else {
|
|
|
|
|
println("Список пользователей:")
|
|
|
|
|
authorizeList.forEach { println(it) }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun changeUserPassword() {
|
|
|
|
|
println("Введите id лошка которому надо поменять пароль")
|
|
|
|
|
val userId = readln().toInt()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val user = authorizeList.find { userId == it.userId }
|
|
|
|
|
|
|
|
|
|
if (user != null) {
|
|
|
|
|
|
|
|
|
|
println("Введите новый пароль:")
|
|
|
|
|
var newPass = readln()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
check(newPass.length >= 8) { "Пароль должен быть не менее 8 символов." }
|
|
|
|
|
check(newPass.any { it.isDigit() && it.isLetter() }) { "Пароль должен содержать и буквы, и цифры." }
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
val newHashPassword = hashPassword(newPass)
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
user.password = newHashPassword
|
|
|
|
|
|
|
|
|
|
println("Пароль успешно изменен.")
|
|
|
|
|
} else {
|
|
|
|
|
println("Пользователь не найден.")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun deleteUser() {
|
|
|
|
|
println("Введите id пользователя, которого нужно удалить:")
|
|
|
|
|
val userId = readln().toInt()
|
|
|
|
|
|
|
|
|
|
// Находим пользователя по userId
|
|
|
|
|
val user = authorizeList.find { it.userId == userId }
|
|
|
|
|
|
|
|
|
|
if (user != null) {
|
|
|
|
|
// Удаляем пользователя из списка
|
|
|
|
|
authorizeList.remove(user)
|
|
|
|
|
println("Пользователь с id $userId успешно удален.")
|
|
|
|
|
} else {
|
|
|
|
|
println("Пользователь с id $userId не найден.")
|
2025-01-13 12:56:42 +00:00
|
|
|
|
}
|
2025-01-14 12:45:14 +00:00
|
|
|
|
}
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
fun showUsersSortedByDate(){
|
|
|
|
|
val sorted = authorizeList.sortedByDescending { it.lastAuthorizeDate }
|
|
|
|
|
println(sorted)
|
|
|
|
|
}
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
fun authorize(): UserAuthorize? {
|
|
|
|
|
println("Введите телефон или почту для авторизации")
|
|
|
|
|
val emailOrPhone = readln()
|
|
|
|
|
println("Введите пароль для авторизации ")
|
|
|
|
|
val pass = readln()
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
val hashedPassword = hashPassword(pass)
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
authorizeList.forEach {
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
if ((emailOrPhone == it.phone || emailOrPhone == it.email) && hashedPassword == it.password) {
|
|
|
|
|
println(it.role)
|
|
|
|
|
return it
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
println("Пользователь не найден")
|
|
|
|
|
return null
|
|
|
|
|
}
|
2025-01-13 12:56:42 +00:00
|
|
|
|
|
|
|
|
|
|
2025-01-14 12:45:14 +00:00
|
|
|
|
|
|
|
|
|
fun hashPassword(password: String): String {
|
|
|
|
|
val salt = ByteArray(16)
|
|
|
|
|
SecureRandom().nextBytes(salt) // Генерация случайной соли
|
|
|
|
|
|
|
|
|
|
val spec = PBEKeySpec(password.toCharArray(), salt, 10000, 256)
|
|
|
|
|
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
|
|
|
|
|
val hash = factory.generateSecret(spec).encoded
|
|
|
|
|
|
|
|
|
|
return salt.joinToString("") { "%02x".format(it) } + ":" + hash.joinToString("") { "%02x".format(it) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun registration(): UserAuthorize {
|
|
|
|
|
println("Введите логин:")
|
|
|
|
|
val userLogin = readln()
|
|
|
|
|
check(userLogin.length >= 4) { "Имя пользователя должно быть не менее 4 символов." }
|
|
|
|
|
|
|
|
|
|
println("Введите пароль:")
|
|
|
|
|
var password = readln()
|
|
|
|
|
println("Введите пароль повторно:")
|
|
|
|
|
var passwordAgain = readln()
|
|
|
|
|
check(password == passwordAgain) { "Пароли не совпадают." }
|
|
|
|
|
|
|
|
|
|
check(password.length >= 8) { "Пароль должен быть не менее 8 символов." }
|
|
|
|
|
check(password.any { it.isDigit() || it.isLetter() }) { "Пароль должен содержать и буквы, и цифры." }
|
|
|
|
|
|
|
|
|
|
val hashedPassword = hashPassword(password)
|
|
|
|
|
|
|
|
|
|
println("Введите email:")
|
|
|
|
|
val email = readln()
|
|
|
|
|
check("@" in email) { "Email должен содержать символ '@'." }
|
|
|
|
|
|
|
|
|
|
println("Введите телефон:")
|
|
|
|
|
val phone = readln()
|
|
|
|
|
check(phone.length == 12 && phone.startsWith("+")) { "Телефон должен начинаться с '+' и содержать 11 символов." }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val newUser = UserAuthorize(
|
|
|
|
|
userId = authorizeList.size + 1,
|
2025-01-13 12:56:42 +00:00
|
|
|
|
login = userLogin,
|
2025-01-14 12:45:14 +00:00
|
|
|
|
password = hashedPassword,
|
2025-01-13 12:56:42 +00:00
|
|
|
|
lastAuthorizeDate = LocalDate.now(),
|
|
|
|
|
email = email,
|
2025-01-14 12:45:14 +00:00
|
|
|
|
phone = phone,
|
|
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
authorizeList.add(newUser)
|
|
|
|
|
|
|
|
|
|
println("Пользователь зарегистрирован успешно!")
|
|
|
|
|
|
|
|
|
|
return newUser
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|