Skip to content

Commit

Permalink
налажено взаиосдействие с КриптоПРО
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexeyAleksandrov committed Apr 20, 2022
0 parents commit 006540c
Show file tree
Hide file tree
Showing 12 changed files with 2,538 additions and 0 deletions.
65 changes: 65 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
cmake_minimum_required(VERSION 3.5)

project(testFiles VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
cryptopro_csp.cpp
cryptopro_csp.h
documnetsigncreator.cpp
documnetsigncreator.h


)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(testFiles
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET testFiles APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(testFiles SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(testFiles
${PROJECT_SOURCES}
)
endif()
endif()

target_link_libraries(testFiles PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(testFiles PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)

if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(testFiles)
endif()
322 changes: 322 additions & 0 deletions CMakeLists.txt.user

Large diffs are not rendered by default.

322 changes: 322 additions & 0 deletions CMakeLists.txt.user.546a4c8

Large diffs are not rendered by default.

324 changes: 324 additions & 0 deletions CMakeLists.txt.user.9f1129b

Large diffs are not rendered by default.

465 changes: 465 additions & 0 deletions cryptopro_csp.cpp

Large diffs are not rendered by default.

99 changes: 99 additions & 0 deletions cryptopro_csp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#ifndef CRYPTOPRO_CSP_H
#define CRYPTOPRO_CSP_H

#include <QDate>
#include <QObject>
#include <QProcess>
#include <QDebug>
#include <QDir>
#include <QThread>

//#include "logclass.h"

#ifdef __linux__
#define CRYPTO_PRO_DIRECTORY "/opt/cprocsp/bin/amd64/"
#define CERTMGR "certmgr"
#define CSPTEST "csptest"
#define SPLITTER_NEW_LINE "\n"
#elif _WIN32
#define CRYPTO_PRO_DIRECTORY "C:/Program Files/Crypto Pro/CSP/"
#define CERTMGR "certmgr.exe"
#define CSPTEST "csptest.exe"
#define SPLITTER_NEW_LINE "\r\n"
#else

#endif

#if QT_VERSION >= 0x050f00 // версия Qt 5.15.2
#define SPLITTER Qt::SplitBehavior(Qt::SkipEmptyParts)
#else
#define SPLITTER QString::SkipEmptyParts
#endif

class CryptoPRO_CSP : public QObject
{
Q_OBJECT
public:
explicit CryptoPRO_CSP(QObject *parent = nullptr);

void setCryptoProDirectory(const QString &value);

// главная структура
struct CryptoSignData
{
// общая информацию о подписи
QString name = "";
QString email = "";
QString serial = "";
QString subname = "";
QString surname = "";
QString name_and_patronymic = "";
QDate startDate;
QDate finishDate;

int index = -1; // информация о подписи для создания sig файла

QString toString()
{
return "email = " + this->email + ", name = " + this->name + ", serial = " + this->serial + ", subname = " + this->subname + ", surname = " + this->surname + ", name_and_patronymic = " + this->name_and_patronymic + ", date_start = " + this->startDate.toString() + ", date_end = " + this->finishDate.toString();
}
};

signals:

private:
QString CryptoProDirectory;

static int getSignIndex(QList<CryptoSignData> allSignsList, CryptoSignData searchSign); // получает подпись по e-mail

struct s_certmgr
{
public:
QString getConsoleText(QStringList options); // запустить программу с опциями
QList<CryptoSignData> getSertifactesList(); // получить список сертификатов
void setCryptoProDirectory(const QString &value);
private:
QString runfile = CERTMGR;
// logClass log;

};
struct s_csptest
{
public:
bool createSign(QString file, CryptoSignData sign); // создать подпись для файла
void setCryptoProDirectory(const QString &value);
private:
QString runfile = CSPTEST;
// logClass log;
};

public:
s_certmgr certmgr; // менеджер сертификатов
s_csptest csptest; // отвечает за создание sig файла

private:
// logClass log;

};

#endif // CRYPTOPRO_CSP_H
185 changes: 185 additions & 0 deletions documnetsigncreator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
#include "documnetsigncreator.h"

#include <QTextCodec>

DocumnetSignCreator::DocumnetSignCreator()
{

}

bool DocumnetSignCreator::processDocument(QString fileInput, QString fileOutput)
{
if(!QFile::exists(fileInput))
{
qDebug() << QString::fromLocal8Bit("Файл для подписи не найден!");
return false;
}

if(jarFileName.isEmpty() || !QFile::exists(jarFileName))
{
qDebug() << QString::fromLocal8Bit("Файл запуска JAR не найден!");
return false;
}

if(!fileOutput.endsWith(".pdf"))
{
qDebug() << QString::fromLocal8Bit("Выходной файл должен быть формата *.pdf");
return false;
}

// готовися к запуску
QProcess process; // запускаемый процесс
// process.setProgram("C:/Program Files/Java/jre1.8.0_301/bin/java.exe"); // запускаемая программа
// process.setProgram("C:/Users/ASUS/Downloads/application_jar/application_jar/application.exe");
process.setProgram("java");
QStringList params; // параметры запуска

// переводим bool в строку
QString drawLogoStr = drawLogo ? "true" : "false";
QString checkTransitionToNewPageStr = checkTransitionToNewPage ? "true" : "false";
params
<< "-jar"
<< jarFileName
<< fileInput
<< fileOutput
<< signOwner
<< signCertificate
<< signDateFrom
<< signDateTo
<< drawLogoStr
<< checkTransitionToNewPageStr
<< insertType;

qDebug() << params;

process.setArguments(params);
process.setReadChannel(QProcess::StandardOutput);
process.start();
bool started = process.waitForStarted(); // ждём запуска программы
if(!started)
{
qDebug() << QString::fromLocal8Bit("Не удалось запустить программу");
return false;
}

bool finished = process.waitForFinished(300000); // время ожидания программы - 5 минут (для слабых ПК)
if(!finished)
{
process.terminate(); // принудительно завершаем процесс
qDebug() << QString::fromLocal8Bit("Превышено время ожидания программы!");
return false;
}

int exitCode = process.exitCode();
if(exitCode != 0)
{
qDebug() << QString::fromLocal8Bit("Процесс завершился с кодом ") << exitCode;

QString text = process.readAllStandardOutput();

QString lineSplitter;
#ifdef __linux__
lineSplitter = "\n";
#elif _WIN32
lineSplitter = "\r\n";
#endif

QStringList error_list = text.split(lineSplitter, Qt::SkipEmptyParts);
qDebug() << "run_error_text = \r\n"; // выводим ошибку
for(auto &&line : error_list)
{
qDebug() << line;
}

return false;
}

if(QFile::exists(fileOutput)) // если файл в итоге создан
{
return true;
}
else
{
return false;
}
}

const QString &DocumnetSignCreator::getSignCertificate() const
{
return signCertificate;
}

void DocumnetSignCreator::setSignCertificate(const QString &newSignCertificate)
{
signCertificate = newSignCertificate;
}

const QString &DocumnetSignCreator::getSignOwner() const
{
return signOwner;
}

void DocumnetSignCreator::setSignOwner(const QString &newSignOwner)
{
signOwner = newSignOwner;
}

const QString &DocumnetSignCreator::getSignDateFrom() const
{
return signDateFrom;
}

void DocumnetSignCreator::setSignDateFrom(const QString &newSignDateFrom)
{
signDateFrom = newSignDateFrom;
}

const QString &DocumnetSignCreator::getSignDateTo() const
{
return signDateTo;
}

void DocumnetSignCreator::setSignDateTo(const QString &newSignDateTo)
{
signDateTo = newSignDateTo;
}

bool DocumnetSignCreator::getDrawLogo() const
{
return drawLogo;
}

void DocumnetSignCreator::setDrawLogo(bool newDrawLogo)
{
drawLogo = newDrawLogo;
}

bool DocumnetSignCreator::getCheckTransitionToNewPage() const
{
return checkTransitionToNewPage;
}

void DocumnetSignCreator::setCheckTransitionToNewPage(bool newCheckTransitionToNewPage)
{
checkTransitionToNewPage = newCheckTransitionToNewPage;
}

const QString &DocumnetSignCreator::getInsertType() const
{
return insertType;
}

void DocumnetSignCreator::setInsertType(const QString &newInsertType)
{
insertType = newInsertType;
}

const QString &DocumnetSignCreator::getJarFileName() const
{
return jarFileName;
}

void DocumnetSignCreator::setJarFileName(const QString &newJarFileName)
{
jarFileName = newJarFileName;
}
Loading

0 comments on commit 006540c

Please sign in to comment.