diff --git a/qmac/nomac.cpp b/qmac/nomac.cpp --- a/qmac/nomac.cpp +++ b/qmac/nomac.cpp @@ -1,119 +1,121 @@ #include "qmac.h" #include //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- class ProcessMacData : public QSharedData { public: ProcessMacData(); int level() const { return _level; } QString levelText() const { return _levelText; } QString categoryText() const { return _categoryText; } private: int _level; QString _levelText; QString _categoryText; }; ProcessMacData::ProcessMacData() : _level(0) , _levelText(QStringLiteral("Нет")) + , _categoryText(QStringLiteral("Нет")) { } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- ProcessMac::ProcessMac() : d(new ProcessMacData) { } ProcessMac::~ProcessMac() = default; //--------------------------------------------------------------------------- int ProcessMac::level() const { return d->level(); } QString ProcessMac::levelText() const { return d->levelText(); } QString ProcessMac::categoryText() const { return d->categoryText(); } bool ProcessMac::canRead(const FileMac& a_fileMac) { Q_UNUSED(a_fileMac) return true; } bool ProcessMac::canWrite(const FileMac& a_fileMac) { Q_UNUSED(a_fileMac) return true; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- class FileMacData : public QSharedData { public: FileMacData(const QString& a_fileName); int level() const { return _level; } QString levelText() const { return _levelText; } QString categoryText() const { return _categoryText; } QString fileName() const { return _fileName; } private: int _level; QString _levelText; QString _categoryText; QString _fileName; }; FileMacData::FileMacData(const QString& a_fileName) : _level(0) , _levelText(QStringLiteral("Нет")) + , _categoryText(QStringLiteral("Нет")) , _fileName(a_fileName) { } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- FileMac::FileMac(const QString& a_fileName) : d(new FileMacData(a_fileName)) { } FileMac::~FileMac() = default; //--------------------------------------------------------------------------- int FileMac::level() const { return d->level(); } QString FileMac::levelText() const { return d->levelText(); } QString FileMac::categoryText() const { return d->categoryText(); } QString FileMac::fileName() const { return d->fileName(); } diff --git a/tests/main.cpp b/tests/main.cpp --- a/tests/main.cpp +++ b/tests/main.cpp @@ -1,234 +1,105 @@ #include "main.h" #include "qmac.h" #include #include #include #include //для getpid #include //для типов операции функции mac_file_permit() #include //заголовочный файл подсистемы MAC библиотеки PARSEC (мандатное разграничения доступа) //#include //#include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTextStream os(stdout); os << "AstraLinux SE security system PARSEC demo application" << '\n' << '\n'; os << "Process name : " << argv[0] << '\n'; //(необязательно) получение идентификатора текущего процесса pid_t pid = getpid(); os << "Process ID : " << pid << '\n'; // // Процессы // ProcessMac processMac; os << "Process MAC level: " << processMac.levelText() << " (" << processMac.level() << ')' << '\n'; os << "Process category : " << processMac.categoryText() << '\n'; // // Файлы // QCommandLineParser parser; parser.process(a); QStringList fileNames = parser.positionalArguments(); for (const auto& fileName : fileNames) { os << '\n'; os << "File name: " << fileName << '\n'; os << "File type: "; QFileInfo fi(fileName); if (!fi.exists()) { os << "does not exist" << '\n'; continue; } if (fi.isDir()) os << "directory" << '\n'; else if (fi.isFile()) os << "regular file" << '\n'; else { os << "unsupported" << '\n'; continue; } FileMac fileMac(fileName); os << "MAC level: " << fileMac.levelText() << " (" << fileMac.level() << ')' << '\n'; os << "MAC categ: " << fileMac.categoryText() << '\n'; //проверка возможности чтения и записи файла bool canRead = processMac.canRead(fileMac); bool canWrite = processMac.canWrite(fileMac); os << "Can read : " << (canRead ? "true" : "false") << '\n'; os << "Can write: " << (canWrite ? "true" : "false") << '\n'; if (fi.isDir()) continue; //проверим, действительно ли невозможно читать и записывать файлы if (!canRead) { QFile f(fileName); if (f.open(QIODevice::ReadOnly)) os << "Can not read, but opened for reading !!!" << '\n'; else os << "Open for reading failed" << '\n'; } if (!canWrite) { QFile f(fileName); if (f.open(QIODevice::ReadWrite)) os << "Can not write, but opened for writing !!!" << '\n'; else os << "Open for writing failed" << '\n'; } } } - -/* - //получение метки текущего процесса, то же, что mac_get_pid(0) или mac_get_pid(pid) - mac_t processMac = mac_get_proc(); - - //текстовое представление метки процесса - ssize_t size; - wchar_t* wtext = mac_to_wtext(processMac, &size, MAC_FMT_TXT | MAC_FMT_LEV); - - os << "Process MAC level: " << QString::fromWCharArray(wtext, size) << " (" << mac_get_lev(processMac) << ')' << '\n'; - - //освободить память, выделенную функцией mac_to_wtext - free(wtext); - - //текстовое представление списка категорий - wtext = mac_to_wtext(processMac, &size, MAC_FMT_TXT | MAC_FMT_CAT); - - os << "Process category : " << QString::fromWCharArray(wtext, size) << '\n'; - - //освободить память, выделенную функцией mac_to_wtext - free(wtext); - - // - // Файлы - // - QCommandLineParser parser; - parser.process(a); - - QStringList fileNames = parser.positionalArguments(); - for (const auto& fileName : fileNames) - { - os << '\n'; - os << "File name: " << fileName << '\n'; - os << "File type: "; - QFileInfo fi(fileName); - if (!fi.exists()) - { - os << "does not exist" << '\n'; - continue; - } - - if (fi.isDir()) - os << "directory" << '\n'; - else if (fi.isFile()) - os << "regular file" << '\n'; - else - { - os << "unsupported" << '\n'; - continue; - } - - //получение метки файла по его имени - mac_t fileMac = mac_get_file(fileName.toLocal8Bit().constData()); - - //текстовое представление метки файла - ssize_t size; - wchar_t* wtext = mac_to_wtext(fileMac, &size, MAC_FMT_TXT | MAC_FMT_LEV); - - os << "MAC level: " << QString::fromWCharArray(wtext, size) << " (" << mac_get_lev(fileMac) << ')' << '\n'; - - //освободить память, выделенную функцией mac_to_wtext - free(wtext); - - //текстовое представление списка категорий - wtext = mac_to_wtext(fileMac, &size, MAC_FMT_TXT | MAC_FMT_CAT); - - os << "MAC categ: " << QString::fromWCharArray(wtext, size) << '\n'; - - //освободить память, выделенную функцией mac_to_wtext - free(wtext); - - //проверка возможности чтения и записи файла - bool canRead = 0 == mac_file_permit(processMac, fileMac, R_OK); - bool canWrite = 0 == mac_file_permit(processMac, fileMac, W_OK); - - os << "Can read : " << (canRead ? "true" : "false") << '\n'; - os << "Can write: " << (canWrite ? "true" : "false") << '\n'; - - //освободить память после использования - mac_free(fileMac); - - if (fi.isDir()) - continue; - - //проверим, действительно ли невозможно читать и записывать файлы - if (!canRead) - { - QFile f(fileName); - - if (f.open(QIODevice::ReadOnly)) - os << "Can not read, but opened for reading !!!" << '\n'; - else - os << "Open for reading failed" << '\n'; - } - - if (!canWrite) - { - QFile f(fileName); - - if (f.open(QIODevice::ReadWrite)) - os << "Can not write, but opened for writing !!!" << '\n'; - else - os << "Open for writing failed" << '\n'; - } - - if (canRead) - { - QFile f(fileName); - - if (f.open(QIODevice::ReadOnly)) - { - //получение метки открытого файла по его дескриптору - mac_t mac = mac_get_fd(f.handle()); - - //получение уровня доступа - mac_lev_t lev = mac_get_lev(mac); - Q_UNUSED(lev) - //os << "MAC level: " << lev << '\n'; - - //освободить память после использования - mac_free(mac); - } - } - } - - //освободить память после использования - mac_free(processMac); -} -*/