-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauthmanager.cpp
More file actions
159 lines (130 loc) · 5.82 KB
/
Copy pathauthmanager.cpp
File metadata and controls
159 lines (130 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include "AuthManager.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QCryptographicHash>
#include <QDebug>
#include <QRegularExpression>
AuthManager::AuthManager(QObject *parent)
: QObject(parent)
{
// Открываем базу данных, но не пытаемся создавать таблицу.
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./Assets/database/UsersDB.db");
if (!db.open()) {
qCritical() << "Не удалось открыть базу данных!";
} else {
qDebug() << "База данных успешно открыта.";
}
}
QString AuthManager::validatePassword(const QString &password) {
// Минимальная длина пароля
if (password.length() < 8) {
return "Пароль должен быть не менее 8 символов.";
}
// Проверка наличия хотя бы одной цифры
QRegularExpression re1("[0-9]");
if (!re1.match(password).hasMatch()) {
return "Пароль должен содержать хотя бы одну цифру.";
}
// Проверка наличия хотя бы одной заглавной буквы
QRegularExpression re2("[A-Z]");
if (!re2.match(password).hasMatch()) {
return "Пароль должен содержать хотя бы одну заглавную букву.";
}
// Проверка наличия хотя бы одного специального символа
QRegularExpression re3("[!@#$%^&*()_,.?\":{}|<>]");
if (!re3.match(password).hasMatch()) {
return "Пароль должен содержать хотя бы один специальный символ.";
}
return "";
}
QString AuthManager::validateLogin(const QString &login) {
// Проверка на пустой логин
if (login.trimmed().isEmpty()) {
return "Логин не может быть пустым.";
}
return "";
}
QString AuthManager::hashData(const QString &data)
{
QByteArray hash = QCryptographicHash::hash(data.toUtf8(), QCryptographicHash::Sha256);
return QString(hash.toHex());
}
bool AuthManager::registerUser(const QString &login, const QString &password, const QString &confirmPassword)
{
// Проверка логина
QString loginError = validateLogin(login);
if (!loginError.isEmpty()) {
emit loginErrorOccurred(loginError); // Отправляем ошибку по логину
return false;
}
// Проверка пароля
QString passwordError = validatePassword(password);
if (!passwordError.isEmpty()) {
emit passwordErrorOccurred(passwordError); // Отправляем ошибку по паролю
return false;
}
// Проверка совпадения паролей
if (password != confirmPassword) {
emit passwordErrorOccurred("Пароли не совпадают!"); // Отправляем ошибку по паролю
return false;
}
QSqlDatabase db = QSqlDatabase::database();
QSqlQuery query;
// Хэшируем пароль
QString hashedPassword = hashData(password);
qDebug() << "Хэшированный пароль:" << hashedPassword;
// Добавляем нового пользователя с хэшированным логином и паролем
query.prepare("INSERT INTO users (login, password) VALUES (?, ?)"); // Используем позиционные параметры
query.addBindValue(login);
query.addBindValue(hashedPassword);
if (!query.exec()) {
qCritical() << "Ошибка регистрации пользователя:" << query.lastError();
return false;
}
qDebug() << "Пользователь успешно зарегистрирован!";
return true;
}
bool AuthManager::loginUser(const QString &login, const QString &password, bool isRememberMe)
{
QSqlDatabase db = QSqlDatabase::database();
QSqlQuery query;
// Хэшируем пароль
QString hashedPassword = hashData(password);
// Проверяем, существует ли такой логин и пароль
query.prepare("SELECT id FROM users WHERE login = :login AND password = :password;");
query.bindValue(":login", login);
query.bindValue(":password", hashedPassword);
if (!query.exec() || !query.next()) {
qWarning() << "Пользователь с таким логином не найден!";
emit loginError("Неверный логин или пароль");
return false;
}
// Получаем хэшированный пароль из базы данных
m_id = query.value(0).toInt();
qDebug() << "Значение ID: " << m_id;
qDebug() << "Успешный вход!";
// Если "Запомнить меня" активировано, сохраняем сессию
if (isRememberMe) {
// Добавляем сессию в таблицу user_sessions
QSqlQuery sessionQuery;
if (!sessionQuery.exec("DELETE FROM user_sessions")) {
qDebug() << "Ошибка при удалении всех сессий:" << sessionQuery.lastError().text();
} else {
qDebug() << "Все сессии успешно удалены";
}
sessionQuery.prepare("INSERT INTO user_sessions (user_id) VALUES (:user_id)");
sessionQuery.bindValue(":user_id", m_id);
if (!sessionQuery.exec()) {
qCritical() << "Ошибка добавления сессии:" << sessionQuery.lastError();
return false;
}
qDebug() << "Сессия пользователя сохранена!";
}
return true;
}
int AuthManager::userID()
{
return m_id;
}