/
breton75
/
modus2
Обзор
Документация
Войти
/
breton75
/
modus2
Код
Запросы
0
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
framework/global/auth.cpp
289 строк
7 KB
breton75
Update auth.cpp, auth.h, and 27 more files...
04 июл 2025, 18:13
04 июл 2025, 18:13
24be1b2
Код
Авторство
О чём код?
#include "auth.h" modus::auth::Rights::Rights(const QString& string) { if(string.size() != 3) { serverControlRight = '-'; editFilesRight = '-'; securityRight = '-'; } if(string.at(0) != 'r' && string.at(0) != 'w') serverControlRight = '-'; else serverControlRight = string.at(0); if(string.at(1) != 'r' && string.at(1) != 'w') editFilesRight = '-'; else editFilesRight = string.at(1); if(string.at(2) != 'r' && string.at(2) != 'w') securityRight = '-'; else securityRight = string.at(2); } modus::auth::Rights::Rights(const QChar _serverControlRight, const QChar _editFilesRight, const QChar _securityRight): serverControlRight(_serverControlRight), editFilesRight(_editFilesRight), securityRight(_securityRight) { } QString modus::auth::Rights::toString() const { return QString("%1%2%3").arg(serverControlRight, editFilesRight, securityRight); } /******** class User *********/ modus::auth::User::User() { } modus::auth::User::User(const QString& _name, const QString& _pass, const Rights& _rights): name(_name), pass(_pass), rights(_rights) { } modus::auth::User::User(const QString& _name, const QString& _pass, const QString& _rights): name(_name), pass(_pass), rights(Rights(_rights)) { } modus::auth::User::User(const modus::auth::User& other): name(other.name), pass(other.pass), rights(other.rights) { } modus::auth::User::User(const modus::auth::User&& other): name(other.name), pass(other.pass), rights(other.rights) { } QString modus::auth::User::toString() { return QString("Имя пользователя: %1 Пароль: %2 Права: %3\n").arg(name, pass, rights.toString()); } void modus::auth::User::clear() { name = ""; pass = ""; rights = Rights(); } /******** funcs *********/ void modus::auth::searchFileInJsonObject(const QDir& dir, const QJsonObject& object, QSet<QString>& filePathsSet, QString& errorString) { for(QString key: object.keys()) { if(object.value(key).isArray()) { modus::auth::searchFileInJsonArray(dir, object.value(key).toArray(),filePathsSet, errorString); } else { if(key == P_FILE) { QString filePath = object.value(key).toString(); modus::auth::getAllFilePathsFromConfig(dir, filePath, filePathsSet, errorString); } else { modus::auth::searchFileInJsonObject(dir, object.value(key).toObject(), filePathsSet, errorString); } } } } void modus::auth::searchFileInJsonArray(const QDir& dir, const QJsonArray& array, QSet<QString>& filePathsSet, QString& errorString) { for(int i = 0; i < array.size(); i++) { if(array.at(i).isArray()) { modus::auth::searchFileInJsonArray(dir, array.at(i).toArray(),filePathsSet, errorString); } else { modus::auth::searchFileInJsonObject(dir, array.at(i).toObject(), filePathsSet, errorString); } } } void modus::auth::getAllFilePathsFromConfig(const QDir& dir, const QString& _hashPath, QSet<QString>& filePathsSet, QString& errorString) { try { QJsonParseError parseError; QString hashPath = dir.absoluteFilePath(_hashPath); // открываем и читаем файл проекта QFile project_file(hashPath); if(!project_file.open(QIODevice::ReadOnly)) throw sv::SvException(QString("Ошибка чтения файла %1\n%2").arg(hashPath).arg(project_file.errorString())); /* загружаем json проекта в QJSonDocument */ QByteArray pba = project_file.readAll(); project_file.close(); JsonParser pjd = JsonParser::fromJson(pba, &parseError); if(parseError.error != QJsonParseError::NoError) throw sv::SvException(QString("Ошибка разбора файла %1\n%2").arg(hashPath).arg(parseError.errorString())); filePathsSet.insert(dir.absoluteFilePath(_hashPath)); QJsonObject project_json = pjd.object(); for(QString key: project_json.keys()) { if(project_json.value(key).isArray()) { modus::auth::searchFileInJsonArray(dir, project_json.value(key).toArray(),filePathsSet, errorString); } else { if(key == P_FILE) { modus::auth::getAllFilePathsFromConfig(dir, project_json.value(key).toString(), filePathsSet, errorString); } } } } catch(const sv::SvException& e) { errorString.append(QString("%1\n").arg(e.error)); } } bool modus::auth::checkFile(const QString& filePath, const QString& hash, QString& errorString) { try { QFile fHash(filePath); if(!fHash.open(QFile::ReadOnly)) throw sv::SvException(QString("Файл\n%1\nне удалось открыть").arg(filePath)); if((QCryptographicHash::hash(QString(fHash.readAll()).toUtf8(), QCryptographicHash::Sha1).toBase64()) != hash) { fHash.close(); errorString.append(QString("Файл\n%1\nбыл изменен\n").arg(filePath)); return false; } fHash.close(); return true; } catch(const sv::SvException& e) { errorString.append(QString("%1\n").arg(e.error)); return false; } } bool modus::auth::checkFileSecurity(const QString& hashPath, const QString& filePath, QString& errorString) { try { QFile fHash(hashPath); if(!fHash.open(QFile::ReadOnly)) throw sv::SvException(QString("Файл\n%1\nне удалось открыть").arg(hashPath)); QString hashText = QString(qUncompress(fHash.readAll())); for(QString line: hashText.split('\n')) { if(line.isEmpty()) continue; QList<QString> ls; ls = line.split(';'); if(ls.size() != 3) throw sv::SvException(QString("В хэш таблице неправильный формат")); if(filePath == ls[0]) return(checkFile(ls[0], ls[1], errorString)); } errorString.append(QString("Файл %1 не найден в хэш таблице\n").arg(filePath)); return false; } catch(const sv::SvException& e) { errorString.append(QString("%1\n").arg(e.error)); return false; } } bool modus::auth::checkFilesSecurity(const QString& hashPath, QStringList& wrongFiles, QString& errorString) { try { QFile fHash(hashPath); if(!fHash.open(QFile::ReadOnly)) throw sv::SvException(QString("Файл\n%1\nне удалось открыть").arg(hashPath)); QString hashText = QString(qUncompress(fHash.readAll())); if(hashText.isEmpty()) throw sv::SvException(QString("Файл\n%1\nПустой или неправильно закодирован").arg(hashPath)); for(QString line: hashText.split('\n')) { if(line.isEmpty()) continue; QList<QString> ls; ls = line.split(';'); if(ls.size() != 3) throw sv::SvException(QString("В хэш таблице неправильный формат")); if(!checkFile(ls[0], ls[1], errorString)) wrongFiles.append(ls[0]); } fHash.close(); return wrongFiles.isEmpty(); } catch(const sv::SvException& e) { errorString.append(QString("%1\n").arg(e.error)); return false; } }