vmprotect-3.5.1/VMProtect/license_dialog.cc

369 lines
14 KiB
C++

#ifdef ULTIMATE
#include "../core/objects.h"
#include "../core/core.h"
#include "../core/lang.h"
#include "widgets.h"
#include "license_dialog.h"
#include "moc/moc_license_dialog.cc"
#include "message_dialog.h"
#include "wait_cursor.h"
#include "help_browser.h"
#include "application.h"
/**
* LicenseDialog
*/
LicenseDialog::LicenseDialog(LicensingManager *manager, License *license, QWidget *parent)
: QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint | Qt::MSWindowsFixedSizeDialogHint), manager_(manager), license_(license)
{
setWindowTitle(QString::fromUtf8(language[lsAddLicense].c_str()));
QFont font;
font.setBold(true);
QLabel *details = new QLabel(QString::fromUtf8(language[lsDetails].c_str()), this);
details->setObjectName("header");
QFrame *groupDetails = new QFrame(this);
groupDetails->setObjectName("gridEditor");
groupDetails->setFrameShape(QFrame::StyledPanel);
QGridLayout *layout = new QGridLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->setHorizontalSpacing(0);
layout->setVerticalSpacing(1);
layout->setColumnMinimumWidth(0, 180 * Application::stylesheetScaleFactor());
layout->setColumnStretch(1, 1);
QLabel *nameLabel = new QLabel(QString::fromUtf8(language[lsCustomerName].c_str()), this);
nameLabel->setObjectName("editor");
nameEdit_ = new LineEdit(this);
nameEdit_->setFrame(false);
nameEdit_->setFont(font);
QLabel *emailLabel = new QLabel(QString::fromUtf8(language[lsEmail].c_str()), this);
emailLabel->setObjectName("editor");
emailEdit_ = new LineEdit(this);
emailEdit_->setFrame(false);
emailEdit_->setFont(font);
QLabel *dateLabel = new QLabel(QString::fromUtf8(language[lsDate].c_str()), this);
dateLabel->setObjectName("editor");
dateEdit_ = new QDateEdit(this);
dateEdit_->setFrame(false);
dateEdit_->setDate(QDate::currentDate());
dateEdit_->setFont(font);
QLabel *orderLabel = new QLabel(QString::fromUtf8(language[lsOrderRef].c_str()), this);
orderLabel->setObjectName("editor");
orderEdit_ = new LineEdit(this);
orderEdit_->setFrame(false);
orderEdit_->setFont(font);
QLabel *commentsLabel = new QLabel(QString::fromUtf8(language[lsComments].c_str()), this);
commentsLabel->setAlignment(Qt::AlignTop);
commentsLabel->setObjectName("editor");
commentsEdit_ = new QPlainTextEdit(this);
commentsEdit_->setFrameShape(QFrame::NoFrame);
commentsEdit_->setMaximumHeight(40 * Application::stylesheetScaleFactor());
commentsEdit_->setFont(font);
commentsEdit_->setTabChangesFocus(true);
layout->addWidget(nameLabel, 0, 0);
layout->addWidget(nameEdit_, 0, 1);
layout->addWidget(emailLabel, 1, 0);
layout->addWidget(emailEdit_, 1, 1);
layout->addWidget(dateLabel, 2, 0);
layout->addWidget(dateEdit_, 2, 1);
layout->addWidget(orderLabel, 3, 0);
layout->addWidget(orderEdit_, 3, 1);
layout->addWidget(commentsLabel, 4, 0);
layout->addWidget(commentsEdit_, 4, 1);
layout->setRowStretch(4, 1);
groupDetails->setLayout(layout);
QLabel *serial = new QLabel(QString::fromUtf8(language[lsSerialNumberContents].c_str()), this);
serial->setObjectName("header");
QFrame *groupSerial = new QFrame(this);
groupSerial->setObjectName("gridEditor");
groupSerial->setFrameShape(QFrame::StyledPanel);
serialNameCheckBox_ = new QCheckBox(QString::fromUtf8(language[lsCustomerName].c_str()), this);
serialNameCheckBox_->setObjectName("editor");
serialNameEdit_ = new LineEdit(this);
serialNameEdit_->setFrame(false);
serialNameEdit_->setFont(font);
serialNameEdit_->setMaxLength(255);
serialEmailCheckBox_ = new QCheckBox(QString::fromUtf8(language[lsEmail].c_str()), this);
serialEmailCheckBox_->setObjectName("editor");
serialEmailEdit_ = new LineEdit(this);
serialEmailEdit_->setFrame(false);
serialEmailEdit_->setFont(font);
serialEmailEdit_->setMaxLength(255);
serialHWIDCheckBox_ = new QCheckBox(QString::fromUtf8(language[lsHardwareID].c_str()), this);
serialHWIDCheckBox_->setObjectName("editor");
serialHWIDEdit_ = new LineEdit(this);
serialHWIDEdit_->setFrame(false);
serialHWIDEdit_->setFont(font);
serialExpirationDateCheckBox_ = new QCheckBox(QString::fromUtf8(language[lsExpirationDate].c_str()), this);
serialExpirationDateCheckBox_->setObjectName("editor");
serialExpirationDateEdit_ = new QDateEdit(this);
serialExpirationDateEdit_->setFrame(false);
serialExpirationDateEdit_->setDate(QDate::currentDate().addMonths(1));
serialExpirationDateEdit_->setFont(font);
serialTimeLimitCheckBox_ = new QCheckBox(QString::fromUtf8(language[lsRunningTimeLimit].c_str()), this);
serialTimeLimitCheckBox_->setObjectName("editor");
serialTimeLimitEdit_ = new QSpinBox(this);
serialTimeLimitEdit_->setFrame(false);
serialTimeLimitEdit_->setRange(0, 255);
serialTimeLimitEdit_->setValue(30);
serialTimeLimitEdit_->setFont(font);
serialMaxBuildDateCheckBox_ = new QCheckBox(QString::fromUtf8(language[lsMaxBuildDate].c_str()), this);
serialMaxBuildDateCheckBox_->setObjectName("editor");
serialMaxBuildDateEdit_ = new QDateEdit(this);
serialMaxBuildDateEdit_->setFrame(false);
serialMaxBuildDateEdit_->setDate(QDate::currentDate().addYears(1));
serialMaxBuildDateEdit_->setFont(font);
QFrame *serialUserDataFrame = new QFrame(this);
serialUserDataFrame->setObjectName("editor");
serialUserDataCheckBox_ = new QCheckBox(QString::fromUtf8(language[lsUserData].c_str()), serialUserDataFrame);
serialUserDataCheckBox_->setObjectName("editor");
serialUserDataEdit_ = new BinEditor(this);
serialUserDataEdit_->setFrameShape(QFrame::NoFrame);
serialUserDataEdit_->setOverwriteMode(false);
serialUserDataEdit_->setMaxLength(255);
serialUserDataEdit_->setMaximumHeight(40 * Application::stylesheetScaleFactor());
font = serialUserDataEdit_->font();
font.setBold(true);
serialUserDataEdit_->setFont(font);
layout = new QGridLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->setHorizontalSpacing(0);
layout->setVerticalSpacing(1);
layout->setColumnMinimumWidth(0, 180 * Application::stylesheetScaleFactor());
layout->setColumnStretch(1, 1);
layout->addWidget(serialNameCheckBox_, 0, 0);
layout->addWidget(serialNameEdit_, 0, 1);
layout->addWidget(serialEmailCheckBox_, 1, 0);
layout->addWidget(serialEmailEdit_, 1, 1);
layout->addWidget(serialHWIDCheckBox_, 2, 0);
layout->addWidget(serialHWIDEdit_, 2, 1);
layout->addWidget(serialExpirationDateCheckBox_, 3, 0);
layout->addWidget(serialExpirationDateEdit_, 3, 1);
layout->addWidget(serialTimeLimitCheckBox_, 4, 0);
layout->addWidget(serialTimeLimitEdit_, 4, 1);
layout->addWidget(serialMaxBuildDateCheckBox_, 5, 0);
layout->addWidget(serialMaxBuildDateEdit_, 5, 1);
layout->addWidget(serialUserDataFrame, 6, 0);
layout->addWidget(serialUserDataEdit_, 6, 1);
groupSerial->setLayout(layout);
QToolButton *helpButton = new QToolButton(this);
helpButton->setShortcut(HelpContentsKeySequence());
helpButton->setIconSize(QSize(20, 20));
helpButton->setIcon(QIcon(":/images/help_gray.png"));
helpButton->setToolTip(QString::fromUtf8(language[lsHelp].c_str()));
connect(helpButton, SIGNAL(clicked(bool)), this, SLOT(helpClicked()));
QPushButton *okButton = new PushButton(QString::fromUtf8(language[lsAddLicense].c_str()), this);
QPushButton *cancelButton = new PushButton(QString::fromUtf8(language[lsCancel].c_str()), this);
QHBoxLayout *buttonLayout = new QHBoxLayout();
buttonLayout->setContentsMargins(0, 0, 0, 0);
buttonLayout->setSpacing(10);
buttonLayout->addWidget(helpButton);
buttonLayout->addStretch();
#ifdef __APPLE__
buttonLayout->addWidget(cancelButton);
buttonLayout->addWidget(okButton);
#else
buttonLayout->addWidget(okButton);
buttonLayout->addWidget(cancelButton);
#endif
QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->setContentsMargins(10, 10, 10, 10);
mainLayout->setSpacing(10);
mainLayout->addWidget(details);
mainLayout->addWidget(groupDetails);
mainLayout->addStretch(1);
mainLayout->addWidget(serial);
mainLayout->addWidget(groupSerial);
mainLayout->addLayout(buttonLayout);
if (license) {
nameEdit_->setText(QString::fromUtf8(license->customer_name().c_str()));
emailEdit_->setText(QString::fromUtf8(license->customer_email().c_str()));
LicenseDate date = license->date();
dateEdit_->setDate(QDate(date.Year, date.Month, date.Day));
orderEdit_->setText(QString::fromUtf8(license->order_ref().c_str()));
commentsEdit_->setPlainText(QString::fromUtf8(license->comments().c_str()));
LicenseInfo *license_info = license_->info();
if (license_info) {
if (license_info->Flags & HAS_USER_NAME) {
serialNameCheckBox_->setChecked(true);
serialNameEdit_->setText(QString::fromUtf8(license_info->CustomerName.c_str()));
}
if (license_info->Flags & HAS_EMAIL) {
serialEmailCheckBox_->setChecked(true);
serialEmailEdit_->setText(QString::fromUtf8(license_info->CustomerEmail.c_str()));
}
if (license_info->Flags & HAS_HARDWARE_ID) {
serialHWIDCheckBox_->setChecked(true);
serialHWIDEdit_->setText(QString::fromLatin1(license_info->HWID.c_str()));
}
if (license_info->Flags & HAS_TIME_LIMIT) {
serialTimeLimitCheckBox_->setChecked(true);
serialTimeLimitEdit_->setValue(license_info->RunningTimeLimit);
}
if (license_info->Flags & HAS_EXP_DATE) {
serialExpirationDateCheckBox_->setChecked(true);
serialExpirationDateEdit_->setDate(QDate(license_info->ExpireDate.Year, license_info->ExpireDate.Month, license_info->ExpireDate.Day));
}
if (license_info->Flags & HAS_MAX_BUILD_DATE) {
serialMaxBuildDateCheckBox_->setChecked(true);
serialMaxBuildDateEdit_->setDate(QDate(license_info->MaxBuildDate.Year, license_info->MaxBuildDate.Month, license_info->MaxBuildDate.Day));
}
if (license_info->Flags & HAS_USER_DATA) {
serialUserDataCheckBox_->setChecked(true);
serialUserDataEdit_->setData(QByteArray(license_info->UserData.c_str(), (int)license_info->UserData.size()));
}
}
}
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
connect(okButton, SIGNAL(clicked()), this, SLOT(okButtonClicked()));
connect(nameEdit_, SIGNAL(textChanged(const QString &)), this, SLOT(nameChanged()));
connect(emailEdit_, SIGNAL(textChanged(const QString &)), this, SLOT(emailChanged()));
connect(serialNameEdit_, SIGNAL(textChanged(const QString &)), this, SLOT(serialNameChanged()));
connect(serialEmailEdit_, SIGNAL(textChanged(const QString &)), this, SLOT(serialEmailChanged()));
connect(serialHWIDEdit_, SIGNAL(textChanged(const QString &)), this, SLOT(HWIDChanged()));
connect(serialExpirationDateEdit_, SIGNAL(dateChanged(const QDate &)), this, SLOT(expirationDateChanged()));
connect(serialTimeLimitEdit_, SIGNAL(valueChanged(int)), this, SLOT(timeLimitChanged()));
connect(serialMaxBuildDateEdit_, SIGNAL(dateChanged(const QDate &)), this, SLOT(maxBuildDateChanged()));
connect(serialUserDataEdit_, SIGNAL(dataChanged()), this, SLOT(userDataChanged()));
setLayout(mainLayout);
setMinimumSize(450 * Application::stylesheetScaleFactor(), 300 * Application::stylesheetScaleFactor());
}
void LicenseDialog::nameChanged()
{
serialNameEdit_->setText(nameEdit_->text());
}
void LicenseDialog::emailChanged()
{
serialEmailEdit_->setText(emailEdit_->text());
}
void LicenseDialog::serialNameChanged()
{
serialNameCheckBox_->setChecked(!serialNameEdit_->text().isEmpty());
}
void LicenseDialog::serialEmailChanged()
{
serialEmailCheckBox_->setChecked(!serialEmailEdit_->text().isEmpty());
}
void LicenseDialog::HWIDChanged()
{
serialHWIDCheckBox_->setChecked(!serialHWIDEdit_->text().isEmpty());
}
void LicenseDialog::expirationDateChanged()
{
serialExpirationDateCheckBox_->setChecked(true);
}
void LicenseDialog::timeLimitChanged()
{
serialTimeLimitCheckBox_->setChecked(true);
}
void LicenseDialog::maxBuildDateChanged()
{
serialMaxBuildDateCheckBox_->setChecked(true);
}
void LicenseDialog::userDataChanged()
{
serialUserDataCheckBox_->setChecked(serialUserDataEdit_->data().size());
}
void LicenseDialog::okButtonClicked()
{
LicenseInfo licenseInfo;
if (serialNameCheckBox_->checkState() == Qt::Checked) {
licenseInfo.Flags |= HAS_USER_NAME;
licenseInfo.CustomerName = serialNameEdit_->text().toUtf8().constData();
}
if (serialEmailCheckBox_->checkState() == Qt::Checked) {
licenseInfo.Flags |= HAS_EMAIL;
licenseInfo.CustomerEmail = serialEmailEdit_->text().toUtf8().constData();
}
if (serialHWIDCheckBox_->checkState() == Qt::Checked) {
licenseInfo.Flags |= HAS_HARDWARE_ID;
licenseInfo.HWID = serialHWIDEdit_->text().toUtf8().constData();
}
if (serialExpirationDateCheckBox_->checkState() == Qt::Checked) {
licenseInfo.Flags |= HAS_EXP_DATE;
QDate date = serialExpirationDateEdit_->date();
licenseInfo.ExpireDate = LicenseDate(date.year(), date.month(), date.day());
}
if (serialTimeLimitCheckBox_->checkState() == Qt::Checked) {
licenseInfo.Flags |= HAS_TIME_LIMIT;
licenseInfo.RunningTimeLimit = (uint8_t)serialTimeLimitEdit_->value();
}
if (serialMaxBuildDateCheckBox_->checkState() == Qt::Checked) {
licenseInfo.Flags |= HAS_MAX_BUILD_DATE;
QDate date = serialMaxBuildDateEdit_->date();
licenseInfo.MaxBuildDate = LicenseDate(date.year(), date.month(), date.day());
}
if (serialUserDataCheckBox_->checkState() == Qt::Checked) {
licenseInfo.Flags |= HAS_USER_DATA;
QByteArray data = serialUserDataEdit_->data();
licenseInfo.UserData = std::string(data.constData(), data.size());
}
try {
WaitCursor wc;
std::string serialNumber = manager_->GenerateSerialNumber(licenseInfo);
QDate date = dateEdit_->date();
license_ = manager_->Add(LicenseDate(date.year(), date.month(), date.day()),
nameEdit_->text().toUtf8().constData(),
emailEdit_->text().toUtf8().constData(),
orderEdit_->text().toUtf8().constData(),
commentsEdit_->toPlainText().toUtf8().constData(),
serialNumber,
false);
} catch (const std::runtime_error &e) {
MessageDialog::critical(this, QString("%1:\n%2").arg(QString::fromUtf8(language[lsSerialNumberError].c_str())).arg(QString::fromUtf8(e.what())), QMessageBox::Ok);
return;
}
accept();
}
void LicenseDialog::helpClicked()
{
HelpBrowser::showTopic("project::licenses");
}
#endif