Skip to content

Commit

Permalink
Add enterprise license check
Browse files Browse the repository at this point in the history
  • Loading branch information
BishopGIS committed Jan 15, 2019
1 parent 2bd8f2a commit 0f8b62b
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 22 deletions.
34 changes: 34 additions & 0 deletions src/core/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,41 @@

#include "core/version.h"

#include "cpl_json.h"

const char* getVersion()
{
return NGLIB_VERSION_STRING;
}

QMap<QString, QVariant> jsonToMap(const QString &path)
{
QMap<QString, QVariant> out;
CPLJSONDocument in;
if(in.Load(path.toStdString())) {
CPLJSONObject root = in.GetRoot();
for(const CPLJSONObject &child : root.GetChildren()) {
QString name = QString::fromStdString(child.GetName());
switch(child.GetType()) {
case CPLJSONObject::Boolean:
out[name] = child.ToBool();
break;
case CPLJSONObject::String:
out[name] = QString::fromStdString(child.ToString());
break;
case CPLJSONObject::Integer:
out[name] = child.ToInteger();
break;
case CPLJSONObject::Long:
out[name] = child.ToLong();
break;
case CPLJSONObject::Double:
out[name] = child.ToDouble();
break;
default:
out[name] = QString::fromStdString(child.ToString());
}
}
}
return out;
}
3 changes: 3 additions & 0 deletions src/core/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

#include <QtCore/QtGlobal>

#include <QVariant>

#if defined(NGSTD_CORE_LIBRARY)
# define NGCORE_EXPORT Q_DECL_EXPORT
#else
Expand All @@ -34,5 +36,6 @@


NGCORE_EXPORT const char *getVersion();
NGCORE_EXPORT QMap<QString, QVariant> jsonToMap(const QString &path);

#endif // NGSTD_CORE_H
4 changes: 2 additions & 2 deletions src/core/request.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ QMap<QString, QVariant> NGRequest::getJsonAsMap(const QString &url)
out[name] = child.ToBool();
break;
case CPLJSONObject::String:
out[name] = QString::fromUtf8(child.ToString().c_str());
out[name] = QString::fromStdString(child.ToString());
break;
case CPLJSONObject::Integer:
out[name] = child.ToInteger();
Expand All @@ -300,7 +300,7 @@ QMap<QString, QVariant> NGRequest::getJsonAsMap(const QString &url)
out[name] = child.ToDouble();
break;
default:
out[name] = QString::fromUtf8(child.ToString().c_str());
out[name] = QString::fromStdString(child.ToString());
}
}
}
Expand Down
101 changes: 82 additions & 19 deletions src/framework/access/access.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,23 @@ NGAccess::NGAccess() :
m_supported(false),
m_avatar(QIcon(":/icons/person-blue.svg"))
{
// Setup license key file
QFileInfo appDir(QCoreApplication::applicationDirPath());

#if defined Q_OS_WIN
m_licenseDir = appDir.dir().absoluteFilePath("share\\license");
#elif defined(Q_OS_MACX)
// 4 level up
QDir updaterDir = appDir.dir();
updaterDir.cdUp();
updaterDir.cdUp();
updaterDir.cdUp();
m_licenseDir = updaterDir.absoluteFilePath("usr/share/license");
#else
m_licenseDir = QLatin1String("/usr/share/license");
#endif


m_updateUserInfoWatcher = new QFutureWatcher<void>(this);
connect(m_updateUserInfoWatcher, SIGNAL(finished()), this,
SLOT(onUserInfoUpdated()));
Expand Down Expand Up @@ -207,6 +224,10 @@ void NGAccess::setClientId(const QString &clientId)
updateUserInfo();
updateSupportInfo();
}
else if(isEnterprise()) {
updateUserInfo();
updateSupportInfo();
}
else {
m_avatar = QIcon(":/icons/person-blue.svg");
}
Expand Down Expand Up @@ -273,6 +294,12 @@ bool NGAccess::isUserAuthorized() const
return m_authorized;
}

bool NGAccess::isEnterprise() const
{
QFileInfo licenseJson(QDir(m_licenseDir).filePath("license.json"));
return licenseJson.exists() && licenseJson.isFile();
}

bool NGAccess::checkSupported()
{
// Read user id, start/end dates, account type
Expand Down Expand Up @@ -413,13 +440,24 @@ void NGAccess::getTokens(const QString &code, const QString &redirectUri)
}
}

extern void updateUserInfoFunction(const QString &configDir)
extern void updateUserInfoFunction(const QString &configDir, const QString &licenseDir)
{
auto result = NGRequest::getJsonAsMap(QString("%1/user_info/").arg(apiEndpoint));
QString firstName = result["first_name"].toString();
QString lastName = result["last_name"].toString();
QString email = result["email"].toString();
QString userId = result["nextgis_guid"].toString();
QString firstName, lastName, email, userId;

// Check local files before request my.nextgis.com
QFileInfo licenseJson(QDir(licenseDir).filePath("license.json"));
QMap<QString, QVariant> result;
if(licenseJson.exists() && licenseJson.isFile()) {
result = jsonToMap(licenseJson.absoluteFilePath());
}
else {
result = NGRequest::getJsonAsMap(QString("%1/user_info/").arg(apiEndpoint));

}
firstName = result["first_name"].toString();
lastName = result["last_name"].toString();
email = result["email"].toString();
userId = result["nextgis_guid"].toString();

QString settingsFilePath = configDir + QDir::separator() + QLatin1String(settingsFile);
QSettings settings(settingsFilePath, QSettings::IniFormat);
Expand All @@ -429,27 +467,50 @@ extern void updateUserInfoFunction(const QString &configDir)
settings.setValue("last_name", lastName);

// Get avatar
QString emailHash = QString(QCryptographicHash::hash(
email.toLower().toLatin1(),
QCryptographicHash::Md5).toHex());
QString avatarPath = configDir + QDir::separator() + QLatin1String(avatarFile);
NGRequest::getFile(QString("https://www.gravatar.com/avatar/%1?s=64&r=pg&d=robohash")
.arg(emailHash), avatarPath);
QFileInfo avatar(QDir(licenseDir).filePath(avatarFile));
if(avatar.exists() && avatar.isFile()) {
if(QFile::exists(avatarPath)) {
QFile::remove(avatarPath);
}
QFile::copy(avatar.absoluteFilePath(), avatarPath);
}
else {
QString emailHash = QString(QCryptographicHash::hash(
email.toLower().toLatin1(),
QCryptographicHash::Md5).toHex());
NGRequest::getFile(QString("https://www.gravatar.com/avatar/%1?s=64&r=pg&d=robohash")
.arg(emailHash), avatarPath);
}
}

extern void updateSupportInfoFunction(const QString &configDir)
extern void updateSupportInfoFunction(const QString &configDir, const QString &licenseDir)
{
auto result = NGRequest::getJsonAsMap(QString("%1/support_info/").arg(apiEndpoint));
bool supported = result["supported"].toBool();
bool supported = false;
QString sign, start_date, end_date;
// Check local files before request my.nextgis.com
QFileInfo licenseJson(QDir(licenseDir).filePath("license.json"));
QMap<QString, QVariant> result;
if(licenseJson.exists() && licenseJson.isFile()) {
result = jsonToMap(licenseJson.absoluteFilePath());
}
else {
result = NGRequest::getJsonAsMap(QString("%1/support_info/").arg(apiEndpoint));
}

supported = result["supported"].toBool();
sign = result["sign"].toString();
start_date = result["start_date"].toString();
end_date = result["end_date"].toString();

QString settingsFilePath = configDir + QDir::separator() + QLatin1String(settingsFile);
QSettings settings(settingsFilePath, QSettings::IniFormat);
settings.setValue("supported", supported);

if(supported) {
settings.setValue("sign", result["sign"].toString());
settings.setValue("start_date", result["start_date"].toString());
settings.setValue("end_date", result["end_date"].toString());
settings.setValue("sign", sign);
settings.setValue("start_date", start_date);
settings.setValue("end_date", end_date);

// Get key file
QString keyFilePath = configDir + QDir::separator() + QLatin1String(keyFile);
Expand Down Expand Up @@ -504,15 +565,17 @@ void NGAccess::updateUserInfo() const
{
auto properties = NGRequest::instance().properties(apiEndpoint);
m_updateToken = properties["updateToken"];
QFuture<void> future = QtConcurrent::run(updateUserInfoFunction, m_configDir);
QFuture<void> future = QtConcurrent::run(updateUserInfoFunction, m_configDir,
m_licenseDir);
m_updateUserInfoWatcher->setFuture(future);
}

void NGAccess::updateSupportInfo() const
{
auto properties = NGRequest::instance().properties(apiEndpoint);
m_updateToken = properties["updateToken"];
QFuture<void> future = QtConcurrent::run(updateSupportInfoFunction, m_configDir);
QFuture<void> future = QtConcurrent::run(updateSupportInfoFunction, m_configDir,
m_licenseDir);
m_updateSupportInfoWatcher->setFuture(future);
}

Expand Down
2 changes: 2 additions & 0 deletions src/framework/access/access.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class NGFRAMEWORK_EXPORT NGAccess : public QObject
bool isFunctionAvailable(const QString &app, const QString &func) const;
bool isUserSupported() const;
bool isUserAuthorized() const;
bool isEnterprise() const;

void setScope(const QString &scope);
void setClientId(const QString &clientId);
Expand Down Expand Up @@ -83,6 +84,7 @@ private slots:
QString m_firstName, m_lastName;
QFile m_logFile;
mutable QString m_updateToken;
QString m_licenseDir;
};

#endif // NGFRAMEWORK_ACCESS_H
18 changes: 17 additions & 1 deletion src/framework/access/signdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,23 @@ NGSignDialog::~NGSignDialog()

void NGSignDialog::updateContent()
{
if(NGAccess::instance().isUserAuthorized()) {
if(NGAccess::instance().isEnterprise()) {
ui->signButton->hide();
ui->learnMore->hide();
ui->userInfo->show();
ui->userInfo->setText(QString("<html><head/><body><p>%1<br>%2</p><p><b>%3</b></p></body></html>")
.arg(NGAccess::instance().firstName())
.arg(NGAccess::instance().lastName())
.arg(NGAccess::instance().isUserSupported() ?
tr("Supported") : tr("Unsupported")));
ui->avatar->show();
ui->avatar->setText(QString("<html><head/><body><p><img src=\"%1\" height=\"64\"/></p></body></html>")
.arg(NGAccess::instance().avatarFilePath()));

ui->ngLogo->hide();
ui->descriptionText->hide();
}
else if(NGAccess::instance().isUserAuthorized()) {
// Show user info in widget
// Name, big avatar, plan
ui->signButton->setText(tr("Exit"));
Expand Down

0 comments on commit 0f8b62b

Please sign in to comment.