Compare commits
No commits in common. "de9ddfd0bb860b85e0dfa200db7196d7f68d5bbf" and "36c83618ee71e740910ae96dbad9822dec37a21b" have entirely different histories.
de9ddfd0bb
...
36c83618ee
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
@ -1,8 +0,0 @@
|
|||||||
package Interface
|
|
||||||
|
|
||||||
import model.User
|
|
||||||
|
|
||||||
interface AdminService {
|
|
||||||
fun removeUserById(userId: Int): Boolean
|
|
||||||
fun getAllUsers(): List<User>
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
package Interface
|
|
||||||
|
|
||||||
import model.User
|
|
||||||
|
|
||||||
/*
|
|
||||||
Interface AuthorizeService {
|
|
||||||
fun registration(user: User):Boolean
|
|
||||||
fun
|
|
||||||
}*/
|
|
@ -1,6 +0,0 @@
|
|||||||
package Interface
|
|
||||||
|
|
||||||
interface PasswordService{
|
|
||||||
fun hashPassword(password:String, salt:ByteArray):String
|
|
||||||
fun matches(password:String, salt:ByteArray, hashedPassword:String):Boolean
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
package RepositoryImpl
|
|
||||||
|
|
||||||
import Interface.AdminService
|
|
||||||
import model.User
|
|
||||||
|
|
||||||
class AdminServiceImpl : AdminService {
|
|
||||||
private val users = mutableListOf<User>()
|
|
||||||
|
|
||||||
override fun removeUserById(userId: Int): Boolean {
|
|
||||||
val user = users.find { it.userId == userId }
|
|
||||||
return if (user != null) {
|
|
||||||
users.remove(user)
|
|
||||||
true }
|
|
||||||
else
|
|
||||||
{ false }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getAllUsers(): List<User> {
|
|
||||||
return users
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
package RepositoryImpl
|
|
||||||
|
|
||||||
import Interface.AuthorizeService
|
|
||||||
import model.User
|
|
||||||
|
|
||||||
class AuthorizeServiceImpl: AuthorizeService{
|
|
||||||
override fun registration(user: User): Boolean {
|
|
||||||
adminService.addUser(user
|
|
||||||
}
|
|
||||||
}*/
|
|
@ -1,20 +0,0 @@
|
|||||||
package RepositoryImpl
|
|
||||||
|
|
||||||
import Interface.PasswordService
|
|
||||||
import javax.crypto.SecretKeyFactory
|
|
||||||
import javax.crypto.spec.PBEKeySpec
|
|
||||||
|
|
||||||
class PasswordServiceImpl : PasswordService {
|
|
||||||
override fun hashPassword(password: String, salt: ByteArray): String {
|
|
||||||
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) }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(password: String, salt: ByteArray, hashedPassword: String): Boolean {
|
|
||||||
val generatedHash = hashPassword(password, salt)
|
|
||||||
return generatedHash == hashedPassword
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,178 +1,73 @@
|
|||||||
|
import model.UserAuthorize
|
||||||
|
import model.Roles
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.security.SecureRandom
|
import java.util.zip.Checksum
|
||||||
import javax.crypto.SecretKeyFactory
|
|
||||||
import javax.crypto.spec.PBEKeySpec
|
|
||||||
|
|
||||||
/*
|
|
||||||
val authorizeList = mutableListOf<UserAuthorize>()
|
val authorizeList = mutableListOf<UserAuthorize>()
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
fun main(){
|
fun main(){
|
||||||
authorizeList.add(registration())
|
authorizeList.add(registration())
|
||||||
val user = authorize()
|
authorizeList.forEach{ println(it)}
|
||||||
if (user != null){
|
|
||||||
when(user.role){"администратор" -> adminPanel()
|
|
||||||
else -> println("уходи ты не админ")}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun adminPanel() {
|
fun authorize():UserAuthorize{
|
||||||
println("Добро пожаловать в панель администратора!")
|
println("Введите почту или телефон")
|
||||||
var action: Int
|
val phone = readlnOrNull()
|
||||||
do {
|
val email = readlnOrNull()
|
||||||
println("Выберите действие:")
|
val checkPhoneEmail = readlnOrNull()
|
||||||
println("1. Вывести всех пользователей")
|
checkNotNull(email)
|
||||||
println("2. Поменять пароль пользователя")
|
checkNotNull(phone)
|
||||||
println("3. Удалить пользователя")
|
checkNotNull(checkPhoneEmail)
|
||||||
println("4. Вывести пользователей по дате последнего входа (убывание)")
|
require(checkPhoneEmail == phone || checkPhoneEmail == email)
|
||||||
println("0. Выйти из панели администратора")
|
require("@" in email)
|
||||||
|
require("+" in phone && phone.length == 11)
|
||||||
|
|
||||||
action = readln().toInt()
|
|
||||||
|
|
||||||
when (action) {
|
|
||||||
1 -> showAllUsers()
|
|
||||||
2 -> changeUserPassword()
|
|
||||||
3 -> deleteUser()
|
|
||||||
4 -> showUsersSortedByDate()
|
|
||||||
0 -> println("Выход из панели администратора.")
|
|
||||||
else -> println("Неверный выбор. Попробуйте снова.")
|
|
||||||
}
|
|
||||||
} while (action != 0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun showAllUsers() {
|
fun registration():UserAuthorize{
|
||||||
if (authorizeList.isEmpty()) {
|
println("Введите логин")
|
||||||
println("Нет пользователей.")
|
val userLogin = readlnOrNull()
|
||||||
} else {
|
checkNotNull(userLogin)
|
||||||
println("Список пользователей:")
|
require(userLogin.length >= 4)
|
||||||
authorizeList.forEach { println(it) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun changeUserPassword() {
|
println("Введите пароль")
|
||||||
println("Введите id лошка которому надо поменять пароль")
|
val password = readlnOrNull()
|
||||||
val userId = readln().toInt()
|
checkNotNull(password)
|
||||||
|
require(password.length>=8)
|
||||||
|
println("Введите пароль повторно")
|
||||||
|
val passwordAgain = password
|
||||||
|
require(password.length>=8 && password == passwordAgain)
|
||||||
|
password.forEach { it.isLetterOrDigit() }
|
||||||
|
|
||||||
|
while (passwordAgain != password){
|
||||||
|
|
||||||
val user = authorizeList.find { userId == it.userId }
|
println("Введите пароль повторно")
|
||||||
|
val passwordAgain = password
|
||||||
|
require(password.length>=8 && password == passwordAgain)
|
||||||
|
password.forEach { it.isLetterOrDigit() }
|
||||||
|
|
||||||
if (user != null) {
|
|
||||||
|
|
||||||
println("Введите новый пароль:")
|
|
||||||
var newPass = readln()
|
|
||||||
|
|
||||||
|
|
||||||
check(newPass.length >= 8) { "Пароль должен быть не менее 8 символов." }
|
|
||||||
check(newPass.any { it.isDigit() && it.isLetter() }) { "Пароль должен содержать и буквы, и цифры." }
|
|
||||||
|
|
||||||
|
|
||||||
val newHashPassword = hashPassword(newPass)
|
|
||||||
|
|
||||||
|
|
||||||
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 не найден.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun showUsersSortedByDate(){
|
|
||||||
val sorted = authorizeList.sortedByDescending { it.lastAuthorizeDate }
|
|
||||||
println(sorted)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun authorize(): UserAuthorize? {
|
|
||||||
println("Введите телефон или почту для авторизации")
|
|
||||||
val emailOrPhone = readln()
|
|
||||||
println("Введите пароль для авторизации ")
|
|
||||||
val pass = readln()
|
|
||||||
|
|
||||||
val hashedPassword = hashPassword(pass)
|
|
||||||
|
|
||||||
authorizeList.forEach {
|
|
||||||
|
|
||||||
if ((emailOrPhone == it.phone || emailOrPhone == it.email) && hashedPassword == it.password) {
|
|
||||||
println(it.role)
|
|
||||||
return it
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
println("Пользователь не найден")
|
println("Введите email")
|
||||||
return null
|
val email = readlnOrNull()
|
||||||
}
|
checkNotNull(email)
|
||||||
|
require("@" in email)
|
||||||
|
|
||||||
|
println("Введите телефон")
|
||||||
|
val phone = readlnOrNull()
|
||||||
|
checkNotNull(phone)
|
||||||
|
require("+" in phone && phone.length == 11)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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,
|
return UserAuthorize(authorizeList.size +1,
|
||||||
|
password = password,
|
||||||
login = userLogin,
|
login = userLogin,
|
||||||
password = hashedPassword,
|
|
||||||
lastAuthorizeDate = LocalDate.now(),
|
lastAuthorizeDate = LocalDate.now(),
|
||||||
email = email,
|
email = email,
|
||||||
phone = phone,
|
phone = phone)
|
||||||
|
}
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
authorizeList.add(newUser)
|
|
||||||
|
|
||||||
println("Пользователь зарегистрирован успешно!")
|
|
||||||
|
|
||||||
return newUser
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
class AdminUser(
|
|
||||||
userId: Int,
|
|
||||||
login: String,
|
|
||||||
password: String,
|
|
||||||
lastAuthorizeDate: LocalDate,
|
|
||||||
email: String,
|
|
||||||
phone: String
|
|
||||||
) : User(userId, login, password, lastAuthorizeDate, email, phone) {
|
|
||||||
override val role: String = "администратор"
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
class DefaultUser(
|
|
||||||
userId: Int,
|
|
||||||
login: String,
|
|
||||||
password: String,
|
|
||||||
lastAuthorizeDate: LocalDate,
|
|
||||||
email: String,
|
|
||||||
phone: String
|
|
||||||
) : User(userId, login, password, lastAuthorizeDate, email, phone) {
|
|
||||||
override val role: String = "пользователь"
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package model
|
|
||||||
|
|
||||||
import java.time.LocalDate
|
|
||||||
|
|
||||||
class ManagerUser(
|
|
||||||
userId: Int,
|
|
||||||
login: String,
|
|
||||||
password: String,
|
|
||||||
lastAuthorizeDate: LocalDate,
|
|
||||||
email: String,
|
|
||||||
phone: String
|
|
||||||
) : User(userId, login, password, lastAuthorizeDate, email, phone) {
|
|
||||||
override val role: String = "менеджер"
|
|
||||||
}
|
|
6
src/main/kotlin/model/Roles.kt
Normal file
6
src/main/kotlin/model/Roles.kt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
data class Roles (
|
||||||
|
val roleId: Int,
|
||||||
|
val roleName: String
|
||||||
|
)
|
@ -1,16 +1,14 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
|
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
|
|
||||||
open class User(
|
data class UserAuthorize(
|
||||||
val userId: Int,
|
val userId: Int,
|
||||||
val login: String,
|
val login: String,
|
||||||
var password: String,
|
var password: String,
|
||||||
var lastAuthorizeDate: LocalDate,
|
var lastAuthorizeDate: LocalDate,
|
||||||
var email: String,
|
var email: String,
|
||||||
var phone: String
|
var phone:String
|
||||||
) { open val role: String = "пользователь" }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user