From 36de8e5d95f79457c8faf870752b4ebdf169a909 Mon Sep 17 00:00:00 2001 From: lordmulder Date: Fri, 25 Mar 2011 15:18:13 +0100 Subject: [PATCH] Make auto updater check for expired version information. --- src/Config.h | 4 ++-- src/Dialog_Update.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/Config.h b/src/Config.h index b0c5ebee..8a7a771b 100644 --- a/src/Config.h +++ b/src/Config.h @@ -25,8 +25,8 @@ #define VER_LAMEXP_MAJOR 4 #define VER_LAMEXP_MINOR_HI 0 #define VER_LAMEXP_MINOR_LO 1 -#define VER_LAMEXP_BUILD 402 -#define VER_LAMEXP_SUFFIX Beta-13 +#define VER_LAMEXP_BUILD 405 +#define VER_LAMEXP_SUFFIX Beta-14 /* * Tools versions diff --git a/src/Dialog_Update.cpp b/src/Dialog_Update.cpp index 9b5af370..b87f1a7d 100644 --- a/src/Dialog_Update.cpp +++ b/src/Dialog_Update.cpp @@ -43,6 +43,7 @@ /////////////////////////////////////////////////////////////////////////////// +static const char *header_id = "!Update"; static const char *section_id = "LameXP"; static const char *mirror_url_postfix[] = @@ -80,6 +81,7 @@ static const char *known_hosts[] = }; static const int MIN_CONNSCORE = 3; +static const int VERSION_INFO_EXPIRES_MONTHS = 6; static char *USER_AGENT_STR = "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101101 IceCat/3.6.12 (like Firefox/3.6.12)"; /////////////////////////////////////////////////////////////////////////////// @@ -544,6 +546,7 @@ bool UpdateDialog::parseVersionInfo(const QString &file, UpdateInfo *updateInfo) QRegExp value("^(\\w+)=(.+)$"); QRegExp section("^\\[(.+)\\]$"); + QDate updateInfoDate; updateInfo->resetInfo(); QFile data(file); @@ -553,6 +556,7 @@ bool UpdateDialog::parseVersionInfo(const QString &file, UpdateInfo *updateInfo) return false; } + bool inHeader = false; bool inSection = false; while(!data.atEnd()) @@ -562,9 +566,10 @@ bool UpdateDialog::parseVersionInfo(const QString &file, UpdateInfo *updateInfo) { m_logFile->append(QString("Sec: [%1]").arg(section.cap(1))); inSection = (section.cap(1).compare(section_id, Qt::CaseInsensitive) == 0); + inHeader = (section.cap(1).compare(header_id, Qt::CaseInsensitive) == 0); continue; } - if(inSection && value.indexIn(line) >= 0) + if(inSection && (value.indexIn(line) >= 0)) { m_logFile->append(QString("Val: '%1' ==> '%2").arg(value.cap(1), value.cap(2))); if(value.cap(1).compare("BuildNo", Qt::CaseInsensitive) == 0) @@ -595,8 +600,35 @@ bool UpdateDialog::parseVersionInfo(const QString &file, UpdateInfo *updateInfo) updateInfo->m_downloadFilecode = value.cap(2).trimmed(); } } + if(inHeader && (value.indexIn(line) >= 0)) + { + m_logFile->append(QString("Val: '%1' ==> '%2").arg(value.cap(1), value.cap(2))); + if(value.cap(1).compare("TimestampCreated", Qt::CaseInsensitive) == 0) + { + QDate temp = QDate::fromString(value.cap(2).trimmed(), Qt::ISODate); + if(temp.isValid()) updateInfoDate = temp; + } + } } + if(!updateInfoDate.isValid()) + { + updateInfo->resetInfo(); + m_logFile->append("WARNING: Version info timestamp is missing!"); + return false; + } + else if(updateInfoDate.addMonths(VERSION_INFO_EXPIRES_MONTHS) < QDate::currentDate()) + { + updateInfo->resetInfo(); + m_logFile->append(QString::fromLatin1("WARNING: This version info has expired at %1!").arg(updateInfoDate.addMonths(VERSION_INFO_EXPIRES_MONTHS).toString(Qt::ISODate))); + return false; + } + else if(QDate::currentDate() < updateInfoDate) + { + m_logFile->append("Version info is from the future, take care!"); + qWarning("Version info is from the future, take care!"); + } + bool complete = true; if(!(updateInfo->m_buildNo > 0)) complete = false; @@ -628,6 +660,12 @@ void UpdateDialog::applyUpdate(void) if(m_updateInfo) { statusLabel->setText("Update is being downloaded, please be patient..."); + frameAnimation->show(); + if(hintLabel->isVisible()) hintLabel->hide(); + if(hintIcon->isVisible()) hintIcon->hide(); + int oldMax = progressBar->maximum(); + int oldMin = progressBar->minimum(); + progressBar->setMaximum(0); QApplication::processEvents(); QProcess process; @@ -652,6 +690,12 @@ void UpdateDialog::applyUpdate(void) loop.exec(); QApplication::restoreOverrideCursor(); + hintLabel->show(); + hintIcon->show(); + progressBar->setRange(oldMin, oldMax); + progressBar->setValue(oldMax); + frameAnimation->hide(); + if(process.exitCode() == 0) { statusLabel->setText("Update ready to install. Applicaion will quit...");