add Services

This commit is contained in:
1billy17 2025-01-20 08:00:10 +03:00
parent 58b3df11f0
commit 35948e1b87
10 changed files with 210 additions and 166 deletions

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,147 +1,108 @@
import model.AdminUser import model.AdminUser
import model.ManagerUser
import model.DefaultUser import model.DefaultUser
import model.ManagerUser
import model.User import model.User
import service.AdminServiceImpl
import service.AuthorizeService
import service.PasswordService
import java.time.LocalDate import java.time.LocalDate
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.PBEKeySpec
import java.util.Base64
val authorizationList = mutableListOf<User>() val authorizationList = mutableListOf<User>()
private const val HASH_LENGTH = 256
private const val ITERATIONS = 65536
val salt = "sosalt"
fun main() { fun main() {
val passwordService = PasswordService()
val adminService = AdminServiceImpl(authorizationList, passwordService)
val authorizeService = AuthorizeService(authorizationList, passwordService)
while (true) { while (true) {
println("1) Регаться тут") println("1) Регистрация")
println("2) Авторизироваться тут") println("2) Авторизация")
var choice = readln() val choice = readln()
if (choice == "1") { when (choice) {
authorizationList.add(registration()) "1" -> {
authorizationList.forEach{ val user = createUser(passwordService)
println(it.userId) val registered = authorizeService.registration(user)
println(it.login) if (registered) {
println(it.password) println("Регистрация успешна")
println(it.email) } else {
println(it.lastAuthorizeDate) println("Пользователь с таким email или логином уже существует")
}
} }
} "2" -> {
else { try {
println(authorization()) println("Введите email:")
val email = readln()
println("Введите пароль:")
val password = readln()
val user = authorizeService.authorize(email, password)
println("Пользователь найден: ${user.login}, тип: ${user::class.simpleName}")
if (user is AdminUser) {
var adminFlg = true
while (adminFlg) {
adminFlg = adminFunctional(adminService)
}
}
} catch (e: IllegalArgumentException) {
println(e.message)
}
}
else -> println("Неверный выбор")
} }
} }
} }
fun createUser(passwordService: PasswordService): User {
println("Введите email:")
val email = readln()
require(email.contains("@")) { "Email должен содержать '@'" }
fun hashPassword(password: String, salt: String): String { println("Введите пароль:")
val saltBytes = Base64.getDecoder().decode(salt) val password = readln()
val spec = PBEKeySpec(password.toCharArray(), saltBytes, ITERATIONS, HASH_LENGTH) require(password.length >= 8 && password.any { it.isDigit() } && password.any { it.isLetter() }) {
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256") "Пароль должен быть не менее 8 символов и содержать буквы и цифры"
val hash = factory.generateSecret(spec).encoded
return Base64.getEncoder().encodeToString(hash)
}
fun registration(): User{
println("Почту пиши")
val user_Email = readlnOrNull()
checkNotNull(user_Email)
require(user_Email.contains("@")) {
"Добавь @"
} }
println("Пароль пиши") println("Повторите пароль:")
val user_Password = readlnOrNull() val confirmPassword = readln()
checkNotNull(user_Password) require(password == confirmPassword) { "Пароли не совпадают" }
require(user_Password.length >= 8 &&
user_Password.any { it.isDigit() } &&
user_Password.any { it.isLetter() && it in 'a'..'z' || it in 'A'..'Z' }
) {
"Длинее делай или цифру/букву добавляй"
}
println("Заново пароль пиши") println("Введите логин:")
val user_Password1 = readlnOrNull() val login = readln()
checkNotNull(user_Password1) require(login.length >= 4) { "Логин должен быть не менее 4 символов" }
require(user_Password1 == user_Password) {
"Ну ты и тупорылый"
}
println("Логин пиши") println("Выберите роль: 1) Обычный пользователь 2) Администратор 3) Менеджер")
val user_Login = readlnOrNull() val role = readln()
checkNotNull(user_Login)
require(user_Login.length >= 4) {
"Длинее делай"
}
val hashedPassword = passwordService.hashPassword(password)
println("ТЫ КТО? 1) лох 2) админо 3) манагер") return when (role) {
val role = readlnOrNull() "1" -> DefaultUser(
checkNotNull(role)
return when(role) {
"1" -> return DefaultUser(
userId = authorizationList.size + 1, userId = authorizationList.size + 1,
login = user_Login, login = login,
password = hashPassword(user_Password, salt), password = hashedPassword,
email = user_Email, email = email,
lastAuthorizeDate = LocalDate.now() lastAuthorizeDate = LocalDate.now()
) )
"2" -> AdminUser(
"2" -> return AdminUser(
userId = authorizationList.size + 1, userId = authorizationList.size + 1,
login = user_Login, login = login,
password = hashPassword(user_Password, salt), password = hashedPassword,
email = user_Email, email = email,
lastAuthorizeDate = LocalDate.now() lastAuthorizeDate = LocalDate.now()
) )
"3" -> ManagerUser(
"3" -> return ManagerUser(
userId = authorizationList.size + 1, userId = authorizationList.size + 1,
login = user_Login, login = login,
password = hashPassword(user_Password, salt), password = hashedPassword,
email = user_Email, email = email,
lastAuthorizeDate = LocalDate.now() lastAuthorizeDate = LocalDate.now()
) )
else -> throw IllegalArgumentException("Некорректный выбор роли")
else -> { throw IllegalArgumentException("error") }
} }
} }
fun adminFunctional(adminService: AdminServiceImpl): Boolean {
fun authorization(): String{
var adminFlg = true
println("Почту пиши")
val user_Email = readlnOrNull()
checkNotNull(user_Email)
val user = authorizationList.find { it.email == user_Email }
require(user != null) {
"нет такого"
}
println("Пароль пиши")
val user_Password = readlnOrNull()
checkNotNull(user_Password)
require(user.password == hashPassword(user_Password, salt)) {
"не то"
}
if (user is AdminUser) {
while (adminFlg == true) {
adminFlg = adminFunctional(user)
}
}
return "такой есть"
}
fun adminFunctional(user: AdminUser): Boolean {
println("1) Показать всех") println("1) Показать всех")
println("2) Показать всех сорт") println("2) Показать всех сорт")
println("3) Поменять пароль") println("3) Поменять пароль")
@ -150,13 +111,32 @@ fun adminFunctional(user: AdminUser): Boolean {
var flg = readln() var flg = readln()
when(flg) { when(flg) {
"1" -> user.allUsers(authorizationList) "1" -> {
"2" -> user.allUsersSort(authorizationList) adminService.getAllUsers().forEach {
"3" -> user.updateUserPassword(authorizationList) println("${it.userId}: ${it.login} (${it.email})")
"4" -> user.removeUser(authorizationList) }
}
"2" -> {
adminService.getAllUsersSort().forEach {
println("${it.userId}: ${it.login} (${it.lastAuthorizeDate})")
}
}
"3" -> {
println("Введите email пользователя для обновления пароля")
val email = readln()
println("Введите новый пароль")
val newPassword = readln()
val updated = adminService.updateUserPassword(email, newPassword)
if (updated) println("Пароль обновлен") else println("Пользователь не найден")
}
"4" -> {
println("Введите ID пользователя для удаления")
val userId = readln().toInt()
val removed = adminService.removeUserById(userId)
if (removed) println("Пользователь удален") else println("Пользователь не найден")
}
"5" -> return false "5" -> return false
} }
return true return true
} }

View File

@ -1,7 +1,5 @@
package model package model
import hashPassword
import salt
import java.time.LocalDate import java.time.LocalDate
class AdminUser( class AdminUser(
@ -10,42 +8,4 @@ class AdminUser(
password: String, password: String,
email: String, email: String,
lastAuthorizeDate: LocalDate, lastAuthorizeDate: LocalDate,
): User(userId, login, password, email, lastAuthorizeDate), IAdminUser { ): User(userId, login, password, email, lastAuthorizeDate)
override fun allUsers(authorizationList: MutableList<User>) {
for (user in authorizationList) {
println(user.login)
}
}
override fun allUsersSort(authorizationList: MutableList<User>) {
authorizationList.sortByDescending { it.lastAuthorizeDate }
for (user in authorizationList) {
println(user.login + " зашел в " + user.lastAuthorizeDate)
}
}
override fun updateUserPassword(authorizationList: MutableList<User>) {
println("Почту пиши для апдейта")
val email = readln()
println("Пароль пиши для апдейта")
val password = readln()
val user = authorizationList.find { it.email == email }
require(user != null) {
"нет такого"
}
user.password = hashPassword(password, salt)
}
override fun removeUser(authorizationList: MutableList<User>) {
println("Почту пиши для апдейта")
val email = readln()
val removed = authorizationList.removeIf { it.email == email }
if (removed) {
println("удалили")
} else { println("не удалили") }
}
}

View File

@ -1,8 +0,0 @@
package model
interface IAdminUser {
fun allUsers(authorizationList: MutableList<User>)
fun allUsersSort(authorizationList: MutableList<User>)
fun updateUserPassword(authorizationList: MutableList<User>)
fun removeUser(authorizationList: MutableList<User>)
}

View File

@ -0,0 +1,28 @@
package service
import model.User
class AdminServiceImpl(private val authorizationList: MutableList<User>, private val passwordService: IPasswordService) : IAdminService {
override fun getAllUsers(): List<User> {
return authorizationList.toList()
}
override fun getAllUsersSort(): List<User> {
return authorizationList.sortedByDescending { it.lastAuthorizeDate }
}
override fun updateUserPassword(email: String, newPassword: String): Boolean {
val user = authorizationList.find { it.email == email }
require(user != null) {
return false
}
user.password = passwordService.hashPassword(newPassword)
return true
}
override fun removeUserById(userId: Int): Boolean {
return authorizationList.removeIf { it.userId == userId }
}
}

View File

@ -0,0 +1,30 @@
package service
import model.User
import java.time.LocalDate
class AuthorizeService(
private val authorizationList: MutableList<User>,
private val passwordService: IPasswordService
) : IAuthorizeService {
override fun registration(user: User): Boolean {
if (authorizationList.any { it.email == user.email || it.login == user.login }) {
return false // Пользователь с таким email или логином уже существует
}
authorizationList.add(user)
return true
}
override fun authorize(email: String, password: String): User {
val user = authorizationList.find { it.email == email }
?: throw IllegalArgumentException("Пользователь с таким email не найден")
if (!passwordService.matches(password, user.password)) {
throw IllegalArgumentException("Неверный пароль")
}
user.lastAuthorizeDate = LocalDate.now()
return user
}
}

View File

@ -0,0 +1,10 @@
package service
import model.User
interface IAdminService {
fun getAllUsers(): List<User>
fun getAllUsersSort(): List<User>
fun updateUserPassword(email: String, newPassword: String): Boolean
fun removeUserById(userId: Int): Boolean
}

View File

@ -0,0 +1,8 @@
package service
import model.User
interface IAuthorizeService {
fun registration(user: User): Boolean
fun authorize(email: String, password: String): User
}

View File

@ -0,0 +1,6 @@
package service
interface IPasswordService {
fun hashPassword(password: String): String
fun matches(password: String, hashedPassword: String): Boolean
}

View File

@ -0,0 +1,24 @@
package service
import java.util.*
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.PBEKeySpec
class PasswordService : IPasswordService{
private val HASH_LENGTH = 256
private val ITERATIONS = 65536
private val salt = "sosalt"
override fun hashPassword(password: String): String {
val saltBytes = Base64.getDecoder().decode(salt)
val spec = PBEKeySpec(password.toCharArray(), saltBytes, ITERATIONS, HASH_LENGTH)
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
val hash = factory.generateSecret(spec).encoded
return Base64.getEncoder().encodeToString(hash)
}
override fun matches(password: String, hashedPassword: String): Boolean {
val hash = hashPassword(password)
return hash == hashedPassword
}
}